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