作者eplis (奶茶不行)
看板C_and_CPP
標題Re: [問題] 沒new導致heap
時間Tue Mar 23 23:23:58 2010
事實上我也是初學者,很多觀念不扎實
希望有人可以出來討論或指點錯誤
 ̄ ̄  ̄ ̄ ̄ ̄
※ 引述《LinRungChuan (吉他手)》之銘言:
: 寫了class若有需要物件,我習慣都會用new
: 我一直以為用new或沒用 差別在於 配了記憶體之後 物件call method
: 物件->method 及 物件.method 使用上的差別而已
: 但我在迴圈內要new物件 兩種寫法有為何會有差別
: ex.
: class A{
: A(int,int);
: functionA(int);
: ~A();
: }
^^ 少了 ;
: void main(){
: int ba=1, la=2, bala=3;
: A *A_Obj;
: for(int i=0 ; i<10 ; i++)
: {
: A_Obj = new A(ba,la);
: A_Obj->functionA(bala);
: }
: }
: 以上寫法可以正常執行
雖然可以執行,有new 但沒有delete
長久下來一定有 memory leak
: 但如果沒使用new, main裡面改成
: void main(){
: int ba=1, la=2, bala=3;
: for(int i=0 ; i<10 ; i++)
: {
: A A_Obj(ba,la);
: A_Obj.functionA(bala);
: }
: }
: 迴圈跑到第2圈 就會有heap 的訊息出現
: 我觀念可能有錯,一直以為兩種寫法都可以,想知道為何不用new的
: 這狀況就不能跑,執行環境是VC++2008
: 感謝
這個很奇怪,這段code我在Visual studio 2008可以執行
不知道我的解讀有沒有錯誤
A A_Obj(ba,la) 是宣告一個A類別的物件,叫做A_Obj
(ba,la)是自己提供的建構子而不用預設的建構子(??)
那這段code沒有new,是不是就不用delete?
迴圈做10次就重複宣告A_Obj?
: =======================補充 分隔線=============================
: 如果放delete在迴圈內
: void main(){
: int ba=1, la=2, bala=3;
: A *A_Obj;
: for(int i=0 ; i<10 ; i++)
: {
: A_Obj = new A(ba,la);
: A_Obj->functionA(bala);
: delete A_Obj;
: }
: }
這段code我同樣可以正常執行
*A_Obj 是一個指標
A_Obj = new A(ba,la) 是提供建構
delete 把 *A_Obj所
指向的內容刪除
在第二次迴圈又再度 assign A_Obj的內容
如果沒有將 A_Obj 指向 NULL 應該會出問題才是
我執行卻正常結束= =||
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.86.10
※ 編輯: eplis 來自: 140.116.86.10 (03/23 23:25)
→ VictorTom:delete掉的pointer本來就沒必要assign成NULL, delete動 03/23 23:28
→ VictorTom:作是告訴MM那段要來的位址不需要了還給你, assign NULL 03/23 23:29
→ VictorTom:只是PG自己可以用其他方式明確的知道一個ptr是否指向合 03/23 23:29
→ VictorTom:法空間(的好習慣吧??) new完之後會拿到一個新的可用的位 03/23 23:29
→ VictorTom:址(成功的話), 之後就操作新的位址(記憶體空間), 所以要 03/23 23:31
→ VictorTom:不要assign NULL在new/delete前後並沒什麼會出問題的:) 03/23 23:31
推 VictorTom:PS.一下, delete還與dtor有關, 上面只先提了MM的部份orz 03/23 23:34
推 LinRungChuan:看來真的是class A那邊的問題了,因為原本的code 03/24 05:27
→ LinRungChuan:class是自己一個project,我回去看它的main,原來就 03/24 05:27
→ LinRungChuan:new了一個物件(提供的建構子沒錯),但是沒有delete 03/24 05:29
→ LinRungChuan:當我在他的main加入delete也是會發生堆積的問題 03/24 05:31
→ LinRungChuan:順便問一下那段沒有用new的寫法,雖然沒配置記憶體 03/24 05:33
→ LinRungChuan:也不用delete,但是執行上一樣發生heap的訊息,那 03/24 05:34
→ LinRungChuan:是不是此寫法本身就有new跟delete的動作在同一位指?? 03/24 05:36
推 littleshan:超明顯啊 應該是你的dtor寫爛了吧! 03/24 09:21