用于在C中返回值的已分配内存

时间:2018-05-07 23:00:34

标签: c garbage-collection free

如果函数的返回值(例如myFunc)是已分配的空间。父函数是否仍然需要释放那部分内存?

例如:

char * myFunc() {
    return malloc(5);

    // free() not called
}

int main() {
    char * str = myFunc();

    // does str need to be freed?
    return 0;
}

2 个答案:

答案 0 :(得分:3)

  

要释放()还是不要释放()?

当进程终止时,它的所有内存都返回给系统,包括malloc包中函数分配的堆内存。在分配内存并继续使用它直到程序终止的程序中,通常会忽略对free()的调用,依赖此行为自动释放内存。这在分配许多内存块的程序中尤其有用,因为在CPU时间方面添加多个free()调用可能会很昂贵,并且编码可能很复杂。 尽管依赖进程终止来自动释放内存对于许多程序来说是可以接受的,但有几个原因可能需要明确释放所有已分配的内存:

1。明确调用free()可能会使程序在未来的修改中更具可读性和可维护性。

2. 如果我们使用malloc调试库来查找程序中的内存泄漏,那么任何未明确释放的内存都将被报告为内存泄漏。这可能会使查找真实内存泄漏的任务变得复杂。

3。要避免memory leak

答案 1 :(得分:1)

建议要释放str:将// does str need to be freed?替换为free(str)。这是避免潜在内存泄漏的良好编程习惯。

在您的情况下,操作系统将清理此短程序所占用的已分配内存。