推 LiloHuang: 還好我寫 C++ 我用 smart pointer (boost::shared_ptr) 06/14 14:46
→ LiloHuang: 倒是看過不少人會定義一個 SAFE_FREE macro 來設 NULL 06/14 14:46
→ LiloHuang: 至於 free 會不會真的還給作業系統要看 C-Runtime 實作 06/14 14:47
→ LiloHuang: glibc 可以用 malloc_stats() 來看有沒有還回去 06/14 14:48
哦~ 看起來 malloc_stats() 不錯用哦~XDD
※ 編輯: Hazukashiine (111.241.158.22), 06/14/2015 14:50:54
→ LiloHuang: 至於 MSVCRT 的話,我沒記錯 free 每次都還回去就是 :) 06/14 14:50
推 chchwy: 你當記憶體用不完阿 不還很快就沒了 06/14 14:57
→ azureblaze: 不free你也只是把問題晾在那邊沒解決啊 06/14 15:09
推 kevingwn: 問題1&2的癥結都在於:不要free()不是你*alloc()出來的指 06/14 15:09
→ kevingwn: 標,例如某DLL是用gcc編譯,你在MSVC的程式去free()它的指 06/14 15:09
→ kevingwn: 標會有不可預期的結果 06/14 15:09
不要 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 了?
→ kevingwn: 問題3:遵守成對是寫C的基本,對此有疑慮建議改用有垃圾回 06/14 15:10
→ kevingwn: 收機制的語言 06/14 15:10
如果是像上述的情況,要怎麼遵守成對?
這兩個程式的片段很可能會在不同的檔案的小角落中...
→ uranusjr: 兩個問題都是因為沒有正確讓它們成對, 成對本身沒有問題 06/14 15:12
→ bibo9901: 推樓上 06/14 15:40
推 Qbsuran: 照這樣想法如果去寫infinity loop 很快就會掛掉 不是所 06/14 15:59
→ Qbsuran: 有程式都要結束 06/14 16:00
推 suhorng: 可是迴圈很多耶, 像是跑不停的伺服器程式 06/14 16:23
→ suhorng: 不能一直不 free 下去呀 06/14 16:24
→ suhorng: 一次性跑一下就沒了的程式就算了 06/14 16:24
→ azureblaze: 要求使用著自己弄一塊記憶體給你寫 06/14 16:33
→ azureblaze: 或是用alloc_str() free_str()給使用者 06/14 16:33
→ azureblaze: 就像fopen和fclose也得成對 06/14 16:35
→ azureblaze: 這是一定得處理的問題,等程式結束絕對不是解決方案 06/14 16:38
恩~理解了~感謝樓上大大 >__<
推 kevingwn: 這種情況free()的責任在Mr.A而不在B,通常A要提供另一個 06/14 17:38
→ kevingwn: 函式給B,B應該呼叫該函式讓A有機會free(),而不是直接使 06/14 17:38
→ kevingwn: 用free() 因為A&B可能經不同的編譯後才連結兩者的malloc 06/14 17:40
→ kevingwn: 及free來自不同的c runtime,混用將造成不可預期的結果 06/14 17:41
→ kevingwn: 若一起編譯的話當然沒問題,但結果是A&B這對CP不可拆不可 06/14 17:41
→ kevingwn: 逆XD不是良好的設計 06/14 17:41
→ ah7675: 你是不是沒修過作業系統@@? 06/14 23:35
還沒哦~ 0.0
※ 編輯: Hazukashiine (140.113.91.124), 06/15/2015 03:10:42
→ Killercat: 現代OS多半都能回收,但是這並沒有保證 06/15 18:26
→ Killercat: 我個人會建議記得的話還是寫一下 06/15 18:26
推 cobrasgo: c不只用在pc上,在mcu上這樣搞就死定了 06/16 18:30
→ Killercat: 應該說 在非保護模式的OS上 一定死 XD 06/17 17:56