看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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 然後不管你用什麼做法, 文件(或註解)都要寫好, 別人才知道要怎麼用 其實多看別人的函式庫怎麼做, 就可以學到很多了 -- 「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。 如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」 -- 班尼多‧加羅素,前義大利藍隊成員 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1434271325.A.306.html
Feis: 就個人觀感, strcpy 的設計並不好 06/14 22:21
Feis: 比較像是為了 copy 語意而做, 他不是建構語意 06/14 22:21
johnhmj: 自己寫!!!用迴圈逐一複製字元 06/15 06:25
askacis: 其實也未必,還是有一些 API要你傳 u8**,你自己要負責收 06/15 07:52
askacis: 尾 free,因為你呼叫的時候根本不知道要 06/15 07:53
askacis: malloc多大記憶體餵給 API,所以 06/15 07:54
askacis: 是由 API幫你 allocate~ 06/15 07:55
askacis: 比如說一些找檔案或是網卡介面資訊的API 06/15 07:56
LPH66: 這種狀況最好的做法是一開始的推文裡 kevingwn 講的那樣 06/15 08:03
LPH66: API 必須提供另一個函式負責收回這些他要來的記憶體 06/15 08:04
LPH66: 比較偷懶一點的 API 會弄個固定大小的靜態記憶體 06/15 08:04
LPH66: 每次呼叫都把東西塞裡面回傳, 這種的最大問題是 06/15 08:05
LPH66: thread unsafe, 不能被一個以上的執行緒同時呼叫 06/15 08:05
descent: strdup 就這麼做阿 06/15 23:56
yvb: 應把 strdup(s) 甚至 memdup(p,n) 視做 *alloc 的另類型式. 06/20 16:37