※ 引述《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
然后不管你用什么做法, 文件(或注解)都要写好, 别人才知道要怎么用
其实多看别人的函式库怎么做, 就可以学到很多了