作者liwmewmew (如果大海能夠)
看板C_and_CPP
標題[問題] 關於動態記憶體delete的用法
時間Tue Oct 11 01:16:33 2011
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC6.0
程式碼(Code):(請善用置底文網頁, 記得排版)
int size = 10;
double **pp;
pp = new double *[size];
for(int i = 0; i < size; i++)
{
pp[i] = new double [size];
for(int j = 0; j < size; j++)
{
pp[i][j] = i*j;
}
}
問題:
在上面的程式 我用動態記憶體 產生了2維陣列
有借有還 所以我必須使用 delete來還
因為new的是[] 所以理當用 delete []來歸還記憶體
可好了 該怎麼還?
1維的 大可直接 delete []p 就釋放了
如今2維的pp 如果依照邏輯上來說 應該是要
for(i = 0; i < size; i++)
{
delete []pp[i];
}
delete []pp;
感覺非常合理 是嗎?
但是書上的教學是
for(i = 0; i < size; i++)
{
delete pp[i];
}
delete pp;
而且以上兩者都可以在VC6.0裡面順利跑完
當然不知道實際上是否真的釋放了記憶體
可是pp不就是指了一個陣列,陣列的每一格又是指標 等著指向目標
但不論陣列的內容是值或指標 他就是一個陣列 不是嗎?
所以至少 最後一個delete 不就是要 delete []pp嗎?
又如果最後一個是delete []pp了
那for裡面的 就應該不是單純的 delete pp[i]了吧?
因為pp[i] 他們也是一個指向陣列的指標
不知道是我概念垮光了
還是怎麼樣...希望板友給我一些幫助
萬分感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.164.2.53
※ 編輯: liwmewmew 來自: 218.164.2.53 (10/11 01:31)
推 littleshan:書寫錯了,丟掉它換一本,順便也把VC6丟掉吧 10/11 01:55
→ littleshan:VC2010 express 或 gcc 都是免費的編譯器 10/11 01:56
→ liwmewmew:Orz 所以我本身以為的那個 delede []pp[i]與delede []pp 10/11 02:15
→ liwmewmew:這樣才是正確的概念阿? 囧 10/11 02:15
→ diabloevagto:YES 10/11 02:36
→ liwmewmew:謝謝兩位大大的指導,好在有懷疑書本,而不是硬背 10/11 03:04
→ liwmewmew:我要燒書+換編譯器了~"~ 10/11 03:04
→ xatier:盡信書,不如無書 10/11 03:09
推 tyc5116:藉這標題問一下,像這問題要怎樣檢查有沒有全部釋放呢?? 10/11 07:10
→ angleevil:valgrind. 10/11 08:56
→ diabloevagto:那個不支援windows...請問windows有沒有類似的軟體? 10/12 08:41
→ angleevil:孩子,這個問題要問藍光 10/12 09:02
→ angleevil:打錯一個字,把光改成影 10/12 09:02
推 tropical72:被點到名了,ide 如果是vs的話,codeproject有份vld好用, 10/12 13:28
→ tropical72:vld是在開發過程中抓memory leak的,若是包成exe後要抓 10/12 13:28
→ tropical72:的話,WinDbg 應算首選,LeakDia 也不錯,使用較簡單, 10/12 13:28