看板 C_and_CPP 關於我們 聯絡資訊
事實上我也是初學者,很多觀念不扎實 希望有人可以出來討論或指點錯誤  ̄ ̄  ̄ ̄ ̄ ̄ ※ 引述《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