※ 引述《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
然後不管你用什麼做法, 文件(或註解)都要寫好, 別人才知道要怎麼用
其實多看別人的函式庫怎麼做, 就可以學到很多了