[問題] delete[] 問題,懷疑記憶體沒放乾淨

看板C_and_CPP作者 (NULL)時間12年前 (2013/09/17 07:36), 編輯推噓4(4026)
留言30則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2008 問題(Question): 如程式碼,懷疑所創的動態記憶體是否沒有釋放乾淨 程式碼(Code):(請善用置底文網頁, 記得排版) 若有一個程式如下: int i,j; int ***KP = new int**[x]; for(i=0;i<x;i++) { KP[i] = new int*[y]; KP[i][0] = new int[y*z]; for(j=0;j<y;j++) KP[i][j] = KP[i][0] + j*z; } //中間略 for(i=0;i<x;i++) { delete[] KP[i][0]; delete[] KP[i]; } delete[] KP; 補充說明(Supplement): 程式執行的結果有時候會對,有時候會錯(這個專案是用於影像處理的定位) y和z在這裡是代表影像的高和寬,因為影像滿大的所以我一開始考慮在最後一個維度 一次new出所需要的記憶體空間(x代表第幾張圖) 而不是採用 KP[j][i] = new int[z]; //剛剛發現這邊打錯了應該是KP[i][j] = ... 這種做法... 但也因為不識很熟悉,所以delete這邊不是很有把握 想請問各位大大,這種寫法是否有問題 這邊懷疑了很久了,希望有在這邊得到一些指點 謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 222.251.16.213

09/17 15:47, , 1F
你要不要試試看把 j=0 改成 j=1 啊
09/17 15:47, 1F

09/17 15:48, , 2F
喔 沒事,請無視樓上推文 orz
09/17 15:48, 2F

09/17 19:28, , 3F
為什麼KP[i] = new int*[y]下一行不是用j<y 來創
09/17 19:28, 3F

09/17 19:28, , 4F
KP[j][0] = new int[y*z]
09/17 19:28, 4F

09/17 19:55, , 5F
他要連續空間吧
09/17 19:55, 5F

09/18 00:19, , 6F
小弟寫的程式必須考慮效能,y為寬度的前提下,必須要new
09/18 00:19, 6F

09/18 00:20, , 7F
y次的 new int[z]; 對於C++也不是很熟 怕會很慢
09/18 00:20, 7F

09/18 00:22, , 8F
整個專案這種動作非常多次,所以採一次建好y*z的記憶體空間
09/18 00:22, 8F
※ 編輯: coolE 來自: 222.251.16.213 (09/18 00:33)

09/18 00:34, , 9F
回so大:我希望的大小是KP[x][y][z]這麼大
09/18 00:34, 9F
※ 編輯: coolE 來自: 222.251.16.213 (09/18 00:36)

09/18 17:33, , 10F
new delete assignment三種動作不要寫在一起
09/18 17:33, 10F

09/18 17:56, , 11F
kp[i][0]的數值可以印出來給我看嗎?
09/18 17:56, 11F

09/18 17:59, , 12F
kp[i][j]計算前後的數值代表什麼意義
09/18 17:59, 12F

09/18 18:19, , 13F
看 delete 的code 我覺得沒甚麼問題。
09/18 18:19, 13F

09/18 18:19, , 14F
如果你是結果有時候對有時候不對,你確認一下是不是
09/18 18:19, 14F

09/18 18:21, , 15F
image buffer 沒有賦予初值的關係
09/18 18:21, 15F

09/18 18:21, , 16F
你先把每個 image buffer 的element 都賦予初值 0
09/18 18:21, 16F

09/18 18:22, , 17F
看結果是不是就會穩了。如果是,再觀察你為什麼沒有對
09/18 18:22, 17F

09/18 18:23, , 18F
buffer 裡面的個值都賦值
09/18 18:23, 18F

09/18 20:55, , 19F
仔細看之後覺得 你還是用一維陣列吧
09/18 20:55, 19F

09/19 16:11, , 20F
回long大:值我印出來了,kp[i][j]計算前是自己的位置
09/19 16:11, 20F

09/19 16:11, , 21F
計算後是存一維陣列的位址
09/19 16:11, 21F

09/19 16:13, , 22F
剛剛寫了一下如圖 http://goo.gl/3ibQ6r
09/19 16:13, 22F

09/19 16:13, , 23F
之所以用到3維是因為 N張影像,用1維我實在寫不下去
09/19 16:13, 23F

09/19 16:14, , 24F
回word大: 我本來就有set初始值的習慣
09/19 16:14, 24F

09/19 16:15, , 25F
若是我上面的寫法沒問題,那我就把精力放在別的地方找BUG了~
09/19 16:15, 25F

09/19 16:16, , 26F
雖然現在為了躲這個問題,我已經換寫法了啦XD
09/19 16:16, 26F

09/19 18:15, , 27F
建議還是學一下debugger怎麼用 數量大的時候printf蠻糟的
09/19 18:15, 27F

09/19 22:41, , 28F
請問一下樓上所說的是下中斷點那種方式嗎?還是有其他好方法?
09/19 22:41, 28F

09/19 23:33, , 29F
斷點是可以設條件的 符合條件時才中斷 監看也有類似功能
09/19 23:33, 29F

09/20 01:36, , 30F
ok受教了 我倒是不知道中斷點可以有條件,我來找看看 謝謝!
09/20 01:36, 30F
文章代碼(AID): #1IE0Pii7 (C_and_CPP)