Re: [討論] 大家對C語言中 free() 的看法?

作者: uranusjr (←這人是超級笨蛋)   2015-06-14 16:42:02
※ 引述《Hazukashiine (恥ずかしい ね...(>///<))》之銘言:
: 不要 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 了?
比較常見的做法是把函式改寫成要使用者自己傳入 malloc 過的記憶體
而不是像你的 ret_string 那樣直接創造並回傳
仔細想想為什麼標準庫的 strcpy 是要你自己建立 target 傳入, 就知道差別了
但如果你的函式有用到 opaque type, 可能就不適合這樣做
(因為使用者不知道要怎麼 malloc)
這種狀況通常會出現在需要被重用的 library code
解決方法是使用一個一致的命名規範
例如 Apple 的 CoreFoundation 等 C framework 就規定
所有會產生需要手動 free 的指標的函式, 都必須包含 Create 這個字
例如 CFStringCreateCopy 產生的 CFString * 就需要手動 free
但 CFStringGetCString 產生的 const char * 就不需要 free
然後不管你用什麼做法, 文件(或註解)都要寫好, 別人才知道要怎麼用
其實多看別人的函式庫怎麼做, 就可以學到很多了
作者: Feis (永遠睡不著 @@)   2015-06-14 22:21:00
就個人觀感, strcpy 的設計並不好比較像是為了 copy 語意而做, 他不是建構語意
作者: johnhmj (耗呆肥羊)   2015-06-15 06:25:00
自己寫!!!用迴圈逐一複製字元
作者: askacis (ASKA)   2015-06-15 07:52:00
其實也未必,還是有一些 API要你傳 u8**,你自己要負責收尾 free,因為你呼叫的時候根本不知道要malloc多大記憶體餵給 API,所以是由 API幫你 allocate~比如說一些找檔案或是網卡介面資訊的API
作者: LPH66 (-6.2598534e+18f)   2015-06-15 08:03:00
這種狀況最好的做法是一開始的推文裡 kevingwn 講的那樣API 必須提供另一個函式負責收回這些他要來的記憶體比較偷懶一點的 API 會弄個固定大小的靜態記憶體每次呼叫都把東西塞裡面回傳, 這種的最大問題是thread unsafe, 不能被一個以上的執行緒同時呼叫
作者: descent (「雄辯是銀,沉默是金」)   2015-06-15 23:56:00
strdup 就這麼做阿
作者: yvb   2015-06-20 16:37:00
應把 strdup(s) 甚至 memdup(p,n) 視做 *alloc 的另類型式.

Links booklink

Contact Us: admin [ a t ] ucptt.com