Re: [討論] 大家對C語言中 free() 的看法?
看板C_and_CPP (C/C++)作者uranusjr (←這人是超級笨蛋)時間10年前 (2015/06/14 16:42)推噓3(3推 0噓 12→)留言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
06/14 22:21, 1F
→
06/14 22:21, , 2F
06/14 22:21, 2F
→
06/15 06:25, , 3F
06/15 06:25, 3F
推
06/15 07:52, , 4F
06/15 07:52, 4F
→
06/15 07:53, , 5F
06/15 07:53, 5F
→
06/15 07:54, , 6F
06/15 07:54, 6F
→
06/15 07:55, , 7F
06/15 07:55, 7F
→
06/15 07:56, , 8F
06/15 07:56, 8F
推
06/15 08:03, , 9F
06/15 08:03, 9F
→
06/15 08:04, , 10F
06/15 08:04, 10F
→
06/15 08:04, , 11F
06/15 08:04, 11F
→
06/15 08:05, , 12F
06/15 08:05, 12F
→
06/15 08:05, , 13F
06/15 08:05, 13F
→
06/15 23:56, , 14F
06/15 23:56, 14F
推
06/20 16:37, , 15F
06/20 16:37, 15F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章