[問題] C malloc與free (已解決 謝謝大家)

看板C_and_CPP作者 (請給我無限亞當couple)時間14年前 (2011/04/16 11:31), 編輯推噓2(2032)
留言34則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev C 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我的程式有一段loop loop會call一個function去做 malloc的動作 因為是link list 接下來還要對link list做動作 所以在同一個function裡面沒有free 之後另外寫一個function來free之前的malloc但是感覺free不完全 因為看自己電腦的記憶體還是一直被吃掉的>< 然後code就跑不動了 餵入的資料(Input): 預期的正確結果(Expected Output): 可以跑完整組數據 152064組 錯誤結果(Wrong Output): 跑到中後段 因為記憶體不足而停止 程式碼(Code):(請善用置底文網頁, 記得排版) code聽了板友建議稍微改了一下 但問題沒有解決>< typedef struct _treenode treenode; struct _treenode { int freq; unsigned char data;//存被encode的值 if not 存256當作node treenode *left, *right; int flag; }; void main() treenode *root; while(infile.get(temp_ch)) { root = build_huffman_2(freq2, ch1, code, codes); ch2= (unsigned char)temp_ch; for (s=codes[ch2]; *s; s++) bitout (outcodeword, *s, &count); freq2[ch1][ch2]++; ch1 = ch2; number_byte ++; printf("total_byte get = %d\n",number_byte); } /////////////////////////////////////////////////////////////// void free_2 (treenode *r, int size) { if ((r->left == NULL) && (r->right == NULL)) { free(r); } else { free_2(r->left, 1); free_2(r->right,1); free(r); } } treenode *build_huffman_2 (int**freqs, int index, char code[], char*codes[]) { int i, n; treenode *x, *y, *z, *r; PQ p; int size; for (i=0; i< MAX_NUM; i++) { x = (treenode*)malloc (sizeof (treenode)); x->left = NULL; x->right = NULL; x->freq = freqs[index][i]; x->data = (unsigned char) i; x->flag = 1; insert (&p, x); } n = p.heap_size-1; for (i=0; i< n; i++) { z = (treenode*)malloc (sizeof (treenode)); x = extract_min (&p);//最小的兩個 x y y = extract_min (&p); z->left = x; z->right = y; z->flag = 0; z->freq = x->freq + y->freq; insert (&p, z); //free(z); } size = p.heap_size; r = extract_min (&p); traverse_2 (r, 0, code, codes, index); free_2(r, size);//改在此free if ((r->left == NULL) && (r->right == NULL)){ cout<<"clear"<<endl;} //發現這個條件不會進來...不知道是不是這個的問題 for(i = 0; i<size; i++) free(p.A[i]); return r; } 補充說明(Supplement): 因為struct裡面有兩個pointer left和right 感覺是可以循線下去free但好像不是這樣子 想請大家幫我看看是哪一個地方沒考慮清楚 謝謝大家>< 後來發現是自己另外一個function裡面會生出一組string 而有pointer造成記憶體不足 改了之後就沒有這個問題了 謝謝版主和大家的幫忙>"< -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.202.30 ※ 編輯: s77727r 來自: 140.113.202.30 (04/16 11:33)

04/16 11:58, , 1F
new 和 malloc 混用不是好事...先全部改同一種再看看
04/16 11:58, 1F

04/16 12:12, , 2F
如果全部改用new的話 x z的部分應該怎麼改
04/16 12:12, 2F

04/16 12:13, , 3F
因為不知道怎麼用 才混用 QQ
04/16 12:13, 3F

04/16 12:59, , 4F
x = new treenode 這樣就好了
04/16 12:59, 4F

04/16 14:14, , 5F
改成new之後 想要用delete可是還是失敗
04/16 14:14, 5F

04/16 14:15, , 6F
沒辦法在之後的free_2中把生出的東西delete掉
04/16 14:15, 6F

04/16 14:26, , 7F
感覺有delete某部分 但是記憶體還是一直被吃(比之前緩慢)
04/16 14:26, 7F

04/16 14:27, , 8F
那就都改成malloc
04/16 14:27, 8F

04/16 14:30, , 9F
剛剛也試過malloc了>< 囧~~~ 不知道自己哪一步少delete
04/16 14:30, 9F

04/16 14:43, , 10F
照我的code的意思 在build裡會產生新的x z
04/16 14:43, 10F

04/16 14:43, , 11F
這樣子 只要照順序去free x z 應該就要清掉 可是好像少了
04/16 14:43, 11F
※ 編輯: s77727r 來自: 140.113.202.30 (04/16 17:04) ※ 編輯: s77727r 來自: 140.113.202.30 (04/16 17:06)

04/16 17:11, , 12F
想要請問應該要怎樣可以確實free 剛剛看了一下 覺得好像
04/16 17:11, 12F

04/16 17:12, , 13F
都沒有free到left和right的pointer 兩個都有值
04/16 17:12, 13F

04/16 17:12, , 14F
loop有進去 但是好像沒有照我想的那樣子free掉我malloc的
04/16 17:12, 14F

04/16 17:12, , 15F
treenode的記憶體空間
04/16 17:12, 15F

04/16 17:15, , 16F
在 free_2 裡面, 是葉節點的時候不要做任何事, 你要
04/16 17:15, 16F

04/16 17:16, , 17F
等父節點把你刪掉, 也不要刪掉傳進來的指標, 最後再
04/16 17:16, 17F

04/16 17:16, , 18F
多作一行刪除根節點即可
04/16 17:16, 18F

04/16 17:24, , 19F
同樣的邏輯也可以直接加在 dtor 裡面~
04/16 17:24, 19F

04/16 17:31, , 20F
囧!! 樓上大大說的我不太明瞭... QQ要怎麼等父節點刪
04/16 17:31, 20F

04/16 17:32, , 21F
剛剛有試過直接free(r->left) free(r->right)
04/16 17:32, 21F

04/16 17:32, , 22F
可是好像還是沒用>< 因為left和right都沒有變成NULL
04/16 17:32, 22F

04/16 17:34, , 23F
free()函式是不會把你的指標變成NULL的 這好像之前討論過..
04/16 17:34, 23F

04/16 17:41, , 24F
04/16 17:41, 24F

04/16 17:42, , 25F
剛剛改過之後 記憶體還是會一直被吃掉耶...是正常的嗎><
04/16 17:42, 25F

04/16 17:43, , 26F
因為還是會中途停止 >< code變成不能跑完
04/16 17:43, 26F

04/16 18:02, , 27F
原 po 可把它弄成可以自動化測試的專案, 附上輸入檔
04/16 18:02, 27F

04/16 18:02, , 28F
比較好找問題
04/16 18:02, 28F

04/16 18:03, , 29F
^對板友來說
04/16 18:03, 29F

04/16 18:17, , 30F
不會載這個~~ 0.0
04/16 18:17, 30F

04/16 18:47, , 31F
等15秒之後 左邊有地方可以按 在FB的讚的附近><
04/16 18:47, 31F

04/16 19:06, , 32F
副檔名是 .org 說..
04/16 19:06, 32F

04/16 19:23, , 33F
是的!!!><
04/16 19:23, 33F

04/16 19:24, , 34F
那要怎開才能變程式碼勒? 0.0
04/16 19:24, 34F
※ 編輯: s77727r 來自: 140.113.202.30 (04/17 01:08) ※ 編輯: s77727r 來自: 140.113.202.30 (04/17 01:10)
文章代碼(AID): #1DgGrw7u (C_and_CPP)