[問題] 一個讓我很驚訝的錯誤訊息請教

看板C_and_CPP作者 (我愛阿蓉)時間15年前 (2009/04/07 01:13), 編輯推噓5(5010)
留言15則, 5人參與, 最新討論串1/1
大家好 今天遇到記憶體問題 debug到剛剛 雖然是個蠢問題 但是讓我很驚訝 請大家告訴我為什麼會這樣~~~ 今天一開始遇到的問題是 class A裡面有class B的指標*ptr 而我用A *a=new A[10]; 我只有給a[0].ptr=有效的值 而我去delete []a; 他怎麼樣都會蕩......... 原來是 [1~9]的ptr 不知道指到哪不能去動他 解決辦法就是要給ptr=NULL; delete才不會出問題 現在想想真蠢= = 發現這問題後 讓我更不解的來了 我想說既然我只有[0]是有效的 , 其他[1~9].ptr 我沒給初始值 那我就寫 delete a; 或是寫 delete &a[0]; 想說回收一個就好,它還是給我一直盪.... 我開一個小測試程式跑跑看 錯誤訊息跟 char *pp="@"; delete pp; 一樣.................. 我的結論就是 你只要是自己寫的class, new出來的空間要回收 一定要一次全部delete ....用delete []a; 不然就會蕩............. 但這讓我很不解.......也很訝異 以前還會看到版上新手問說 delete ptr和delete[]ptr差在哪... 沒想到差這麼多 我不懂為什麼會降子,請強者給予觀念指證好嘛@@ 這跟我測試的例子delete一個const char*會蕩掉 有關聯嗎? class A { public: A(){} int x; ~A(){cout<<x<<endl; } }; int main() { A *p=new A[10]; for(int i=0;i<10;i++) p[i].x=i; delete p; } 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.207.211

04/07 01:27, , 1F
我想說, 你要不乾脆把code貼上來....-_-||
04/07 01:27, 1F

04/07 01:28, , 2F
看來是個 慘....
04/07 01:28, 2F

04/07 01:28, , 3F
你文章這樣寫, 第一個只猜你A和B的ctor和dtor有問題Orz
04/07 01:28, 3F

04/07 01:30, , 4F
而且, 未初始ptr給NULL看起來就是該在A的ctor裡做的?
04/07 01:30, 4F

04/07 01:31, , 5F
還有, 要多少個/多大回來, 就要一次還多少回去....
04/07 01:31, 5F

04/07 01:38, , 6F
我也是猜 constructor/destructor 的問題
04/07 01:38, 6F
※ 編輯: QQ29 來自: 140.113.207.211 (04/07 01:42)

04/07 01:42, , 7F
補上了測試小程式@@ 抱歉 所以我的盲點就是不能只回收一個嘛
04/07 01:42, 7F

04/07 01:43, , 8F
話說回來, 自己new的就要自己delete, 寫code本來就有很
04/07 01:43, 8F

04/07 01:43, , 9F
多成對的習慣要養成....~_~
04/07 01:43, 9F

04/07 01:44, , 10F
用 new[] 就要用 delete[] 呀
04/07 01:44, 10F

04/07 01:49, , 11F
糟~~我用DevCpp測, 它還真的讓我一個一個還....Orz
04/07 01:49, 11F

04/07 01:50, , 12F
delete &p[2]; delete &p[3]; etc看來小弟觀念待修正Orz
04/07 01:50, 12F

04/07 02:02, , 13F
拿VC2005測, 上面這樣又是assert又是dbg_break的/in CRT
04/07 02:02, 13F

04/07 02:04, , 14F
所以還是等強者們來解釋這段吧....zzzZZZ
04/07 02:04, 14F

04/07 20:26, , 15F
沒什麼好問的,new [] 就是配 delete []
04/07 20:26, 15F
文章代碼(AID): #19sZWuTK (C_and_CPP)