[問題] 鏈結串列的釋放

看板C_and_CPP (C/C++)作者 (無言)時間12年前 (2014/02/14 11:42), 編輯推噓0(0014)
留言14則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++, GCC 問題(Question): 我最近在編譯某個別人寫好的 source code, 用 gcc 跟 VC++ 都可以通過編譯, 但執行時就會引發中斷。 檢查的結果,是在釋放鏈結串列時發生了錯誤。 我是有找出會引發中斷的程式碼並 mark 掉或改寫另一形式後解決。 但原本的程式碼我也看不出什麼錯誤,希望大家能幫忙找出原因。 程式碼(Code):(請善用置底文網頁, 記得排版) 鏈結串列的結構 typedef struct _float_list { float *f; struct _float_list *next; } float_list; 這是一個用來存放浮點數的鏈結串列 原本的釋放鏈結串列的程式碼 for(tmp = top->next; tmp != NULL; tmp = next) { cur = tmp; next = tmp->next; free(cur->f); free(cur); //會發生中斷的位置 cur->f = NULL; cur = NULL; } free(top); -------------------------------------------------------- 修改版本 1: for(tmp = top->next; tmp != NULL; tmp = next) { cur = tmp; next = tmp->next; free(cur->f); cur->f = NULL; } for(tmp = top->next; tmp != NULL; tmp = next) { cur = tmp; next = tmp->next; free(cur); cur = NULL; } free(top); 把鏈結串列裡的陣列指標跟鏈結節點的指標分開釋放就不會出錯。 -------------------------------------------------------- 修改版本 2: for(tmp = top->next; tmp != NULL; tmp = next) { cur = tmp; next = tmp->next; free(cur->f); free(cur); //cur->f = NULL; //cur = NULL; } 不要將 cur->f 和 cur 指標設為 NULL 就不會發生錯誤。 -------------------------------------------------------- 請問何解? 我不覺得版本 1 和原版有何不同啊? 為什麼版本 2 不要設定 NULL 反而不會出錯,不指到 NULL 會有什麼潛在問題嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.156.228

02/14 11:49, , 1F
你都free cur了, 還要cur去做事情。cur早就死掉了
02/14 11:49, 1F

02/14 11:55, , 2F
再請教,既然cur已經死掉了,那為什麼會在free(cur)的地
02/14 11:55, 2F

02/14 11:56, , 3F
方中斷。那為什麼修改版本 1 卻又沒事呢?
02/14 11:56, 3F

02/14 11:57, , 4F
你free掉的指標,就不能再拿他來做操作
02/14 11:57, 4F

02/14 11:57, , 5F
你操作他,一般情況就會跳exception
02/14 11:57, 5F

02/14 11:58, , 6F
這個很明顯就是你還不懂指標是怎麼回事
02/14 11:58, 6F

02/14 11:59, , 7F
你錯的地方就是cur已經被free了,你還要拿他的f出來用
02/14 11:59, 7F

02/14 12:06, , 8F
那這麼說的話,如果我只 mark 掉 cur->f = NULL 也可以囉
02/14 12:06, 8F

02/14 13:15, , 9F
我懂了,謝謝你的說明。想再問free後NULL有需要嗎?
02/14 13:15, 9F

02/14 13:50, , 10F
看個人需求,指向NULL是好習慣。也可以讓使用這段code的人
02/14 13:50, 10F

02/14 13:51, , 11F
可以事先檢查指標是不是NULL,用來防止不必要的錯誤
02/14 13:51, 11F

02/14 13:52, , 12F
如果你很確定這個指標free之後,100%不會再有人拿的到他了
02/14 13:52, 12F

02/14 13:53, , 13F
那不管他也可以
02/14 13:53, 13F

02/14 13:54, , 14F
了解了,謝謝你的幫忙。
02/14 13:54, 14F
文章代碼(AID): #1I_P2vlb (C_and_CPP)
文章代碼(AID): #1I_P2vlb (C_and_CPP)