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

看板C_and_CPP (C/C++)作者 (←這人是超級笨蛋)時間10年前 (2015/06/14 16:42), 編輯推噓3(3012)
留言15則, 6人參與, 最新討論串4/4 (看更多)
※ 引述《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

06/14 22:21, , 1F
就個人觀感, strcpy 的設計並不好
06/14 22:21, 1F

06/14 22:21, , 2F
比較像是為了 copy 語意而做, 他不是建構語意
06/14 22:21, 2F

06/15 06:25, , 3F
自己寫!!!用迴圈逐一複製字元
06/15 06:25, 3F

06/15 07:52, , 4F
其實也未必,還是有一些 API要你傳 u8**,你自己要負責收
06/15 07:52, 4F

06/15 07:53, , 5F
尾 free,因為你呼叫的時候根本不知道要
06/15 07:53, 5F

06/15 07:54, , 6F
malloc多大記憶體餵給 API,所以
06/15 07:54, 6F

06/15 07:55, , 7F
是由 API幫你 allocate~
06/15 07:55, 7F

06/15 07:56, , 8F
比如說一些找檔案或是網卡介面資訊的API
06/15 07:56, 8F

06/15 08:03, , 9F
這種狀況最好的做法是一開始的推文裡 kevingwn 講的那樣
06/15 08:03, 9F

06/15 08:04, , 10F
API 必須提供另一個函式負責收回這些他要來的記憶體
06/15 08:04, 10F

06/15 08:04, , 11F
比較偷懶一點的 API 會弄個固定大小的靜態記憶體
06/15 08:04, 11F

06/15 08:05, , 12F
每次呼叫都把東西塞裡面回傳, 這種的最大問題是
06/15 08:05, 12F

06/15 08:05, , 13F
thread unsafe, 不能被一個以上的執行緒同時呼叫
06/15 08:05, 13F

06/15 23:56, , 14F
strdup 就這麼做阿
06/15 23:56, 14F

06/20 16:37, , 15F
應把 strdup(s) 甚至 memdup(p,n) 視做 *alloc 的另類型式.
06/20 16:37, 15F
文章代碼(AID): #1LVJvTC6 (C_and_CPP)
文章代碼(AID): #1LVJvTC6 (C_and_CPP)