[問題] 關於動態記憶體delete的用法

看板C_and_CPP作者 (如果大海能夠)時間14年前 (2011/10/11 01:16), 編輯推噓3(3014)
留言17則, 7人參與, 最新討論串1/1
開發平台(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)

10/11 01:55, , 1F
書寫錯了,丟掉它換一本,順便也把VC6丟掉吧
10/11 01:55, 1F

10/11 01:56, , 2F
VC2010 express 或 gcc 都是免費的編譯器
10/11 01:56, 2F

10/11 02:15, , 3F
Orz 所以我本身以為的那個 delede []pp[i]與delede []pp
10/11 02:15, 3F

10/11 02:15, , 4F
這樣才是正確的概念阿? 囧
10/11 02:15, 4F

10/11 02:36, , 5F
YES
10/11 02:36, 5F

10/11 03:04, , 6F
謝謝兩位大大的指導,好在有懷疑書本,而不是硬背
10/11 03:04, 6F

10/11 03:04, , 7F
我要燒書+換編譯器了~"~
10/11 03:04, 7F

10/11 03:09, , 8F
盡信書,不如無書
10/11 03:09, 8F

10/11 07:10, , 9F
藉這標題問一下,像這問題要怎樣檢查有沒有全部釋放呢??
10/11 07:10, 9F

10/11 08:56, , 10F
valgrind.
10/11 08:56, 10F

10/12 08:41, , 11F
那個不支援windows...請問windows有沒有類似的軟體?
10/12 08:41, 11F

10/12 09:02, , 12F
孩子,這個問題要問藍光
10/12 09:02, 12F

10/12 09:02, , 13F
打錯一個字,把光改成影
10/12 09:02, 13F

10/12 13:28, , 14F
被點到名了,ide 如果是vs的話,codeproject有份vld好用,
10/12 13:28, 14F

10/12 13:28, , 15F
vld是在開發過程中抓memory leak的,若是包成exe後要抓
10/12 13:28, 15F

10/12 13:28, , 16F
的話,WinDbg 應算首選,LeakDia 也不錯,使用較簡單,
10/12 13:28, 16F

10/12 13:28, , 17F
Umdh.exe"好像"可用,但感覺不適合 http://0rz.tw/sHchJ
10/12 13:28, 17F
文章代碼(AID): #1EaoXrmY (C_and_CPP)