Re: [問題] 沒new導致heap

看板C_and_CPP作者 (奶茶不行)時間14年前 (2010/03/23 23:24), 編輯推噓3(3012)
留言15則, 3人參與, 最新討論串2/4 (看更多)
事實上我也是初學者,很多觀念不扎實 希望有人可以出來討論或指點錯誤  ̄ ̄  ̄ ̄ ̄ ̄ ※ 引述《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)

03/23 23:28, , 1F
delete掉的pointer本來就沒必要assign成NULL, delete動
03/23 23:28, 1F

03/23 23:29, , 2F
作是告訴MM那段要來的位址不需要了還給你, assign NULL
03/23 23:29, 2F

03/23 23:29, , 3F
只是PG自己可以用其他方式明確的知道一個ptr是否指向合
03/23 23:29, 3F

03/23 23:29, , 4F
法空間(的好習慣吧??) new完之後會拿到一個新的可用的位
03/23 23:29, 4F

03/23 23:31, , 5F
址(成功的話), 之後就操作新的位址(記憶體空間), 所以要
03/23 23:31, 5F

03/23 23:31, , 6F
不要assign NULL在new/delete前後並沒什麼會出問題的:)
03/23 23:31, 6F

03/23 23:34, , 7F
PS.一下, delete還與dtor有關, 上面只先提了MM的部份orz
03/23 23:34, 7F

03/24 05:27, , 8F
看來真的是class A那邊的問題了,因為原本的code
03/24 05:27, 8F

03/24 05:27, , 9F
class是自己一個project,我回去看它的main,原來就
03/24 05:27, 9F

03/24 05:29, , 10F
new了一個物件(提供的建構子沒錯),但是沒有delete
03/24 05:29, 10F

03/24 05:31, , 11F
當我在他的main加入delete也是會發生堆積的問題
03/24 05:31, 11F

03/24 05:33, , 12F
順便問一下那段沒有用new的寫法,雖然沒配置記憶體
03/24 05:33, 12F

03/24 05:34, , 13F
也不用delete,但是執行上一樣發生heap的訊息,那
03/24 05:34, 13F

03/24 05:36, , 14F
是不是此寫法本身就有new跟delete的動作在同一位指??
03/24 05:36, 14F

03/24 09:21, , 15F
超明顯啊 應該是你的dtor寫爛了吧!
03/24 09:21, 15F
文章代碼(AID): #1BgDqH9P (C_and_CPP)
文章代碼(AID): #1BgDqH9P (C_and_CPP)