看板 C_and_CPP 關於我們 聯絡資訊
大家好 今天遇到記憶體問題 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
VictorTom:我想說, 你要不乾脆把code貼上來....-_-|| 04/07 01:27
xam:看來是個 慘.... 04/07 01:28
VictorTom:你文章這樣寫, 第一個只猜你A和B的ctor和dtor有問題Orz 04/07 01:28
VictorTom:而且, 未初始ptr給NULL看起來就是該在A的ctor裡做的? 04/07 01:30
VictorTom:還有, 要多少個/多大回來, 就要一次還多少回去.... 04/07 01:31
xam:我也是猜 constructor/destructor 的問題 04/07 01:38
※ 編輯: QQ29 來自: 140.113.207.211 (04/07 01:42)
QQ29:補上了測試小程式@@ 抱歉 所以我的盲點就是不能只回收一個嘛 04/07 01:42
VictorTom:話說回來, 自己new的就要自己delete, 寫code本來就有很 04/07 01:43
VictorTom:多成對的習慣要養成....~_~ 04/07 01:43
james732:用 new[] 就要用 delete[] 呀 04/07 01:44
VictorTom:糟~~我用DevCpp測, 它還真的讓我一個一個還....Orz 04/07 01:49
VictorTom:delete &p[2]; delete &p[3]; etc看來小弟觀念待修正Orz 04/07 01:50
VictorTom:拿VC2005測, 上面這樣又是assert又是dbg_break的/in CRT 04/07 02:02
VictorTom:所以還是等強者們來解釋這段吧....zzzZZZ 04/07 02:04
yoco315:沒什麼好問的,new [] 就是配 delete [] 04/07 20:26