我知道我们应该释放任何用malloc分配的变量,但如果我在函数中返回它会怎么样?像这样:
char *somefunction(int somearg){
char *str;
str=(char *)malloc(sizeof(char *));
//some code
return str;
}
我应该释放str吗?我怎么能这样做?
答案 0 :(得分:13)
你有两个选择:一,将char *传递给某个函数并使用它而不是在某个函数中分配,或者两个函数,稍后释放返回值。
第一个选项:
char *somefunction(char *str, int somearg){
//some code
return str;
}
// Elsewhere...
char *str = (char *) malloc....;
somefunction(str, 123);
// Code...
free(str);
第二个选项:
char *somestr = somefunction(123);
// Do something...
free(somestr);
我个人建议使用第一个选项,因为当它没有在仲裁函数中分配时,更容易避免泄漏内存。
答案 1 :(得分:4)
完成后即可释放它。没有规则说与malloc()匹配的free()必须在同一个函数中。
答案 2 :(得分:2)
你应该释放所有分配的空间,但如果你返回它,因为你将在程序的其他部分使用这些内存空间,所以在你使用之后你应该释放。查看代码中调用函数的每个位置,并在使用返回值后释放空间。
答案 3 :(得分:2)
如果你打算返回块的地址,你不应该释放()块,而是依赖于调用代码以后释放()它。这叫做onwership传递。
如果在函数中释放它并返回指针,则调用代码将在尝试访问已释放的块时遇到未定义的行为。
答案 4 :(得分:2)
这是一些现有函数(例如strdup()
)的惯例,但通常是个坏主意。要求用户了解函数调用内部发生的事情是一个不好的要求 - 想想你使用了多少函数是谁的内部隐藏对你。
一般来说,您需要让用户传入缓冲区和大小,而不是为它们分配内存。