返回已分配的变量

时间:2009-08-20 12:16:36

标签: c malloc

我知道我们应该释放任何用malloc分配的变量,但如果我在函数中返回它会怎么样?像这样:

char *somefunction(int somearg){
    char *str;

    str=(char *)malloc(sizeof(char *));

    //some code

    return str;
}

我应该释放str吗?我怎么能这样做?

5 个答案:

答案 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())的惯例,但通常是个坏主意。要求用户了解函数调用内部发生的事情是一个不好的要求 - 想想你使用了多少函数是谁的内部隐藏对你。 一般来说,您需要让用户传入缓冲区和大小,而不是为它们分配内存。

相关问题