[問題] std::string配置記憶體

看板C_and_CPP作者 (Nestarneal)時間12年前 (2013/12/12 23:05), 編輯推噓4(4015)
留言19則, 8人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Visual Studio 2010 問題(Question): 我把跟問題無關的 code 刪除後如下: http://codepad.org/BdGcERZD 我有兩個 class 分別是 A 以及 B B 裡面的 private member 只有一個 std::string 的變數 A 則是有一個 pointer 指向 B 我在 A 的 Constructor 內動態配置了記憶體, 所以有一個動態大小的陣列,是由 class B 構成。 我的疑問在於如果把中斷點放在第 22 行 _length = length; 我就可以發現在前一行配置完記憶體後,顯示錯誤如下: 名稱 值 _ptr 0x004a1368{_name=<錯誤 Ptr>} _name <錯誤 Ptr> 所以之後如果我如果要存取他的值,就會有如下的錯誤訊息: 「於 0x0f46cafa (msvcr100d.dll) 的 teststring.exe 中發生未處理的例外狀況: 0xC0000005: 寫入位置 0xcdcdcdcd 時發生存取違規」 並且還會跳出 memcpy.asm 的檔案出來, 而我如果用 printf 的 %x 把 _name 的值印出來,則是會顯示 cdcdcdcd。 我以前用 std::string 都只用其中一些函數 find、substr...等等的, 第一次遇到這種情形,不曉得這是哪裡出錯了呢? 在此請教各位前輩,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.158.87

12/12 23:09, , 1F
C++ 中絕不可以使用 malloc 去配置物件的記憶體
12/12 23:09, 1F

12/12 23:10, , 2F
因為它不會幫你呼叫建構式,導致物件內容是無效的
12/12 23:10, 2F

12/12 23:11, , 3F
除非是要用 placement new (這不在你的使用情況中)
12/12 23:11, 3F

12/12 23:11, , 4F
正確做法應該是 _ptr = new B[length];
12/12 23:11, 4F

12/12 23:11, , 5F
更好的做法則是用 std::vector
12/12 23:11, 5F

12/12 23:17, , 6F
其實我本來也都是使用 new,不過我聽人家說有些
12/12 23:17, 6F

12/12 23:17, , 7F
compiler 不支援 new,建議我用 malloc,才改用它
12/12 23:17, 7F

12/12 23:17, , 8F
所以雖然可能會有 compiler 不支援的問題,
12/12 23:17, 8F

12/12 23:18, , 9F
但如果涉及到物件,還是該用 new 嗎?
12/12 23:18, 9F

12/12 23:18, , 10F
不支援new就不支援c++了吧 std::string也沒辦法用
12/12 23:18, 10F

12/12 23:19, , 11F
不支援new的compiler根本不應該叫C++ compiler啊XDDDDD
12/12 23:19, 11F

12/12 23:21, , 12F
原來如此,所以我還是繼續用 new 就可以了對吧 XD
12/12 23:21, 12F

12/12 23:27, , 13F
改成 new 後果然可以 work 了 XD 謝謝!
12/12 23:27, 13F

12/12 23:50, , 14F
你聽誰說得...........
12/12 23:50, 14F

12/13 00:00, , 15F
using std namespace 加上去看看
12/13 00:00, 15F

12/13 00:01, , 16F
抱歉應該是 using namespace std;
12/13 00:01, 16F

12/13 00:14, , 17F
他大概是聽一個只會C語言&沒有寫過C++程式的人說的...
12/13 00:14, 17F

12/13 03:48, , 18F
是說這年代了真的還有非C++ compiler?
12/13 03:48, 18F

12/13 09:14, , 19F
太幽默了XDD
12/13 09:14, 19F
文章代碼(AID): #1IgT36It (C_and_CPP)