看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
littleshan:C++ 中絕不可以使用 malloc 去配置物件的記憶體 12/12 23:09
littleshan:因為它不會幫你呼叫建構式,導致物件內容是無效的 12/12 23:10
littleshan:除非是要用 placement new (這不在你的使用情況中) 12/12 23:11
littleshan:正確做法應該是 _ptr = new B[length]; 12/12 23:11
littleshan:更好的做法則是用 std::vector 12/12 23:11
Nestarneal:其實我本來也都是使用 new,不過我聽人家說有些 12/12 23:17
Nestarneal:compiler 不支援 new,建議我用 malloc,才改用它 12/12 23:17
Nestarneal:所以雖然可能會有 compiler 不支援的問題, 12/12 23:17
Nestarneal:但如果涉及到物件,還是該用 new 嗎? 12/12 23:18
azureblaze:不支援new就不支援c++了吧 std::string也沒辦法用 12/12 23:18
littleshan:不支援new的compiler根本不應該叫C++ compiler啊XDDDDD 12/12 23:19
Nestarneal:原來如此,所以我還是繼續用 new 就可以了對吧 XD 12/12 23:21
Nestarneal:改成 new 後果然可以 work 了 XD 謝謝! 12/12 23:27
diabloevagto:你聽誰說得........... 12/12 23:50
fanntone:using std namespace 加上去看看 12/13 00:00
fanntone:抱歉應該是 using namespace std; 12/13 00:01
tomnelson:他大概是聽一個只會C語言&沒有寫過C++程式的人說的... 12/13 00:14
danny8376:是說這年代了真的還有非C++ compiler? 12/13 03:48
BlazarArc:太幽默了XDD 12/13 09:14