[討論] 大家對C語言中 free() 的看法?
看板C_and_CPP (C/C++)作者Hazukashiine (恥ずかしい ね...(>///<))時間10年前 (2015/06/14 14:40)推噓7(7推 0噓 27→)留言34則, 11人參與討論串1/4 (看更多)
許多教程式的教授或是工程師會認為一個好的程式中 free() 與 *alloc() 必須成對。
通常執行 free() 並不會把 memory 還給 operating system,
反而是告訴程式,下一次 *alloc() 的時候,可以用一下之前 free() 過的空間。
這種設計並不壞,主要是為了節省 system call 的時間消耗。
雖然心中覺得成對會比較嚴謹一點,不過在實作的時候確實會容易造成問題。
問題一:
前一個人 free() 掉之後,並沒有把指標設成 NULL,然後還在 code 中到處流串,
只要一不小心,*** glibc detected *** double free or corruption 就會死給你看,
這種 bug 最噁心了,尤其在其他 code 不是你寫的時候。
問題二:
當一個函數的回傳值是一個指向空間的指標的時候,
而且這個函數會將這個指標送給超過一個的函數的話,
只要其中一個函數 free() 掉之後,其他的函數也會跟著遭殃,
通常會送個 Segmentation fault (core dumped) 當作聖誕節禮物。
程式在結束的時候,大部分的作業系統都會回收記憶體,
所以,若在程式碼結尾的地方 free() 掉所有申請過的空間,也是多此一舉。
我的看法是,若該指標出現在迴圈中或是遞迴中的話,才有使用 free() 的必要,
其餘的指標就讓作業系統去回收吧,畢竟通常吃記憶體的怪獸都是迴圈或遞迴中的指標。
大家怎麼看?通常都會嚴格遵守成對的習慣嗎?
--
當教授在講臺上C++的時候,我的臉比佳佳還要沮喪...
講正經的... C++是一個被過度設計的程式語言,完全遭透了!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.241.158.22
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1434264021.A.274.html
※ 編輯: Hazukashiine (111.241.158.22), 06/14/2015 14:40:33
推
06/14 14:46, , 1F
06/14 14:46, 1F
→
06/14 14:46, , 2F
06/14 14:46, 2F
→
06/14 14:47, , 3F
06/14 14:47, 3F
→
06/14 14:48, , 4F
06/14 14:48, 4F
哦~ 看起來 malloc_stats() 不錯用哦~XDD
※ 編輯: Hazukashiine (111.241.158.22), 06/14/2015 14:50:54
→
06/14 14:50, , 5F
06/14 14:50, 5F
推
06/14 14:57, , 6F
06/14 14:57, 6F
→
06/14 15:09, , 7F
06/14 15:09, 7F
推
06/14 15:09, , 8F
06/14 15:09, 8F
→
06/14 15:09, , 9F
06/14 15:09, 9F
→
06/14 15:09, , 10F
06/14 15:09, 10F
不要 free() 不是我 *alloc 出的指標,
但是如果像是這樣怎麼辦?@@?
A.cpp written by Mr.A
char *ret_string(const char* str_1)
{
char *str_2 = malloc(sizeof(char) * (strlen(str) + 1))
strcpy(str_2, str_1);
return str_2;
}
B.cpp written by myself
int main(void)
{
printf("%s", ret_string("hello!"));
}
如果不去 free() 不是我 *alloc 出的指標,這樣一來,不就 memory leak 了?
→
06/14 15:10, , 11F
06/14 15:10, 11F
→
06/14 15:10, , 12F
06/14 15:10, 12F
如果是像上述的情況,要怎麼遵守成對?
這兩個程式的片段很可能會在不同的檔案的小角落中...
→
06/14 15:12, , 13F
06/14 15:12, 13F
→
06/14 15:40, , 14F
06/14 15:40, 14F
推
06/14 15:59, , 15F
06/14 15:59, 15F
→
06/14 16:00, , 16F
06/14 16:00, 16F
推
06/14 16:23, , 17F
06/14 16:23, 17F
→
06/14 16:24, , 18F
06/14 16:24, 18F
→
06/14 16:24, , 19F
06/14 16:24, 19F
→
06/14 16:33, , 20F
06/14 16:33, 20F
→
06/14 16:33, , 21F
06/14 16:33, 21F
→
06/14 16:35, , 22F
06/14 16:35, 22F
→
06/14 16:38, , 23F
06/14 16:38, 23F
恩~理解了~感謝樓上大大 >__<
推
06/14 17:38, , 24F
06/14 17:38, 24F
→
06/14 17:38, , 25F
06/14 17:38, 25F
→
06/14 17:40, , 26F
06/14 17:40, 26F
→
06/14 17:41, , 27F
06/14 17:41, 27F
→
06/14 17:41, , 28F
06/14 17:41, 28F
→
06/14 17:41, , 29F
06/14 17:41, 29F
→
06/14 23:35, , 30F
06/14 23:35, 30F
還沒哦~ 0.0
※ 編輯: Hazukashiine (140.113.91.124), 06/15/2015 03:10:42
→
06/15 18:26, , 31F
06/15 18:26, 31F
→
06/15 18:26, , 32F
06/15 18:26, 32F
推
06/16 18:30, , 33F
06/16 18:30, 33F
→
06/17 17:56, , 34F
06/17 17:56, 34F
討論串 (同標題文章)
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 1 之 4 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章