[問題] 鏈結串列的釋放
開發平台(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
02/14 11:49, 1F
→
02/14 11:55, , 2F
02/14 11:55, 2F
→
02/14 11:56, , 3F
02/14 11:56, 3F
→
02/14 11:57, , 4F
02/14 11:57, 4F
→
02/14 11:57, , 5F
02/14 11:57, 5F
→
02/14 11:58, , 6F
02/14 11:58, 6F
→
02/14 11:59, , 7F
02/14 11:59, 7F
→
02/14 12:06, , 8F
02/14 12:06, 8F
→
02/14 13:15, , 9F
02/14 13:15, 9F
→
02/14 13:50, , 10F
02/14 13:50, 10F
→
02/14 13:51, , 11F
02/14 13:51, 11F
→
02/14 13:52, , 12F
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
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章