[問題] 釋放記憶體錯誤問題

看板C_and_CPP作者 (K.L)時間12年前 (2013/10/27 22:55), 編輯推噓2(2039)
留言41則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VS 2012 問題(Question): 想要將動態配置出來的記憶體釋放掉,但是一直顯示錯誤 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/UWG3A0Gz 網頁連結是配置記憶體過程置釋放中所做過的事//剛剛將中間做過的事拿掉可以 不大確定是否哪邊出了問題@ @" //順利釋放記憶體 int n = 6500000; double **temp; temp = (double**)malloc((n+1)*sizeof(double*)); for(int i = 0 ; i < n+1; i++) {temp[i]=(double *)malloc((4)*sizeof(double*));} for(int i = 0 ; i < n+1 ; i++) {free(temp[i]);} free(temp); 補充說明(Supplement): 之前曾經寫過類似的程式,一樣不能執行釋放記憶體 索性註解掉 但丟到同學筆電中他用Dev C++卻沒問題 是哪邊想法錯誤了嗎? 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.190.239

10/27 23:01, , 1F
2nd malloc後面應是sizeof(double)?
10/27 23:01, 1F

10/27 23:04, , 2F
http://ppt.cc/UpZ2 28行 他也是寫(int*)? 所以要拿掉?
10/27 23:04, 2F

10/27 23:13, , 3F
雖然一樓說得沒錯,但size對或錯在這邊感覺不是錯誤原因
10/27 23:13, 3F

10/27 23:14, , 4F
發生的是什麼錯誤?compiler抱怨error還是runtime error?
10/27 23:14, 4F

10/27 23:19, , 5F
執行時中斷
10/27 23:19, 5F

10/27 23:22, , 6F
配置到釋放期間沒做別的事?
10/27 23:22, 6F

10/27 23:22, , 7F
重跑中 看看釋放到i=?時中斷
10/27 23:22, 7F

10/27 23:22, , 8F
沒有耶@@"
10/27 23:22, 8F

10/27 23:23, , 9F
喔喔 配置到釋放中有拿掉了 重新測試中
10/27 23:23, 9F
※ 編輯: kimgtob 來自: 140.116.190.239 (10/27 23:38)

10/27 23:42, , 10F
將n改成10也會錯 是中間的操作出了問題嗎@@"?
10/27 23:42, 10F

10/27 23:44, , 11F
n & check = 10 釋放記憶體也是有問題@@"
10/27 23:44, 11F

10/27 23:44, , 12F
temp[i]=(double *)malloc((4)*sizeof(double*));
10/27 23:44, 12F

10/27 23:44, , 13F
temp[i]=(double *)malloc((4)*sizeof(double));
10/27 23:44, 13F

10/27 23:45, , 14F
將星號拿掉就對了 感謝mail6543210 & soheadsome
10/27 23:45, 14F

10/27 23:46, , 15F
我想到了,double*在32-bit程式是4 bytes,double是8 bytes
10/27 23:46, 15F

10/27 23:46, , 16F
所以為什麼會錯@@" ??
10/27 23:46, 16F

10/27 23:47, , 17F
你說呢?
10/27 23:47, 17F

10/27 23:53, , 18F
因為 釋放掉的記憶體大小<配置出來的記憶體大小嗎?
10/27 23:53, 18F

10/27 23:55, , 19F
因為問題根本不是出在 free(), 而是在中間就出現存取錯誤
10/27 23:55, 19F

10/27 23:55, , 20F
還是說是因為中間操作過程是塞 double的值給記憶體 所以會
10/27 23:55, 20F

10/27 23:56, , 21F
掛掉? 學宿網路好慢 有點時間差
10/27 23:56, 21F

10/27 23:56, , 22F
free時是照原本allocate時的大小去free,這個資訊OS有記住
10/27 23:56, 22F

10/27 23:57, , 23F
所以是錯在將double值 放到 double*的陣列中嗎?
10/27 23:57, 23F

10/28 00:06, , 24F
中間的 code 我看不到, 只有你知道了 @.@
10/28 00:06, 24F

10/28 00:07, , 25F
中間的code有放在短連結中 那個連結壞掉了嗎?
10/28 00:07, 25F

10/28 00:08, , 26F
可是回頭檢查int*配置 塞int值 int&int*大小也不一樣嗎@@"
10/28 00:08, 26F

10/28 00:09, , 27F
喔喔, 看到了 @.@
10/28 00:09, 27F

10/28 00:09, , 28F
你可以把sizeof(int),sizeof(int*)用printf印出來看看
10/28 00:09, 28F

10/28 00:13, , 29F
int 4 int* 4 double 8 double* 4
10/28 00:13, 29F

10/28 00:13, , 30F
看起來應該是錯在while裡面,超界寫到不該寫的memory
10/28 00:13, 30F

10/28 00:14, , 31F
所以你知道那位寫 int* 的為什麼沒出事了...運氣好一樣大
10/28 00:14, 31F

10/28 00:15, , 32F
之前 int int* 也釋放不了記憶體@ @"還被同學酸愛用VS
10/28 00:15, 32F

10/28 00:18, , 33F
當你說無法釋放記憶體,我合理懷疑你不知道出錯的是哪一行
10/28 00:18, 33F

10/28 00:21, , 34F
所以之前同學電腦可以執行(自己不行)沒有問題是剛剛好的?
10/28 00:21, 34F

10/28 00:21, , 35F
我有點沒講清楚 抱歉 我之前同樣類型的程式int int*
10/28 00:21, 35F

10/28 00:22, , 36F
自己的電腦執行會錯 但是請同學幫忙除錯時順利釋放
10/28 00:22, 36F

10/28 00:26, , 37F
剛剛重跑舊程式 釋放成功 ~~" 感謝樓上所有高手相助
10/28 00:26, 37F

10/28 00:29, , 38F
有可能是 compile 成 32-bit 和 64-bit 的差別
10/28 00:29, 38F

10/28 00:29, , 39F
在 64-bit 應用程式裡 int* 和 double* 是 8 bytes
10/28 00:29, 39F

10/28 00:30, , 40F
反而變成 double 沒事了, 風水輪流轉
10/28 00:30, 40F

10/28 00:31, , 41F
謝謝樓上的知識!
10/28 00:31, 41F
文章代碼(AID): #1IRIbrCl (C_and_CPP)