作者LinRungChuan (吉他手)
看板C_and_CPP
標題[問題] 沒new導致heap
時間Tue Mar 23 16:10:11 2010
寫了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, 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
感謝
=======================補充 分隔線=============================
如果放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;
}
}
會發生跟第2種寫法,沒有用new一樣的問題 當執行到第2圈 程式會中止
且跳出訊息視窗:
Windows has triggered a breakpoint in XXX.exe.
This may be due to a corruption of the heap, which indicates a bug in
XXX.exe or any of the DLLs it has loaded.
this may also be due to the user pressing F12 while XXX.exe has focus.
================================================================
原本手頭有兩個projects一個是模擬project另一個是演算法project
現在要把模擬的 併到 演算法裡面 來開發另一個新的演算法
我把舊的演算法的project當主程式
當跑到for裡的建構子就是去執行模擬的那個project
兩分code 併起來 好亂>.<...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 161.130.178.135
推 dendrobium:第一種有明顯的memory leak 03/23 16:12
推 littleshan:有沒有new差很多,建議你重新整理一下你的觀念 03/23 16:13
→ LinRungChuan:如果放delete A_Obj在迴圈內 會跟沒有* 一樣發生heap 03/23 17:16
→ LinRungChuan:有沒有new我還在google中 目前還是爬到.跟->的差別XD 03/23 17:18
→ freesamael:我不懂什麼叫「發生heap」,你知道heap是什麼嗎? 03/23 17:24
推 Bencrie:發生堆積 - -a 03/23 17:31
→ LinRungChuan:恩恩翻譯應該是~堆積或堆疊吧,歹勢 我沒有很正規的學 03/23 17:52
推 VictorTom:你可以貼上完整的code, 我想heap後面八成還有字.... 03/23 17:53
→ LinRungChuan:C++都是上網跟翻書,但現在手邊只有一本老舊的中文 03/23 17:53
※ 編輯: LinRungChuan 來自: 161.130.178.135 (03/23 18:12)
→ freesamael:現在看起來是 Class A 的程式碼有問題 03/23 18:32
推 VictorTom:同樓上; 再不然就是你合併哪裡弄壞了XD 03/23 18:33
→ LinRungChuan:感謝:) 那我只好回到模擬的code找了...有沒有比較 03/23 19:04
→ LinRungChuan:有效率的方式找問題出在哪段~~模擬的project是已經 03/23 19:05
→ LinRungChuan:被發表的文章提供的source code一堆class跟methods 03/23 19:06
→ LinRungChuan:我現在只能一段一段下斷點來找╤.╤.. 03/23 19:07
→ rephansu:有沒有可能是使用了未分配成功或以釋放的指標? 03/23 19:30
推 yoco315:聽小弟一言,C++是個你「必需要很正規的學」才可以的語言 03/23 20:59
→ yoco315:不然比較建議你去寫 Java 或是其他 script lang 03/23 21:00