为 C 中的返回值分配内存
Allocated memory for returning values in C
如果一个函数的 return 值,比如说 myFunc
,是一个分配的 space。父函数还需要释放那部分内存吗?
例如:
char * myFunc() {
return malloc(5);
// free() not called
}
int main() {
char * str = myFunc();
// does str need to be freed?
return 0;
}
建议 释放 str
:将 // does str need to be freed?
替换为 free(str)
。这是避免潜在内存泄漏的良好编程习惯。
在你的例子中,OS 将清理这个短程序占用的分配内存。
To free() or not to free()?
当一个进程终止时,它的所有内存都返回给系统,包括由 malloc 包中的函数分配的堆内存。在分配内存并继续使用直到程序终止的程序中,通常会忽略对 free()
的调用,依靠这种行为来自动释放内存。这在分配许多内存块的程序中特别有用,因为添加对 free()
的多次调用在 CPU 时间方面可能很昂贵,而且代码可能很复杂。
虽然依靠进程终止来自动释放内存对于许多程序来说是可以接受的,但是有几个原因可以解释为什么需要显式释放所有分配的内存:
1.显式调用free()
可能使程序在以后的修改中更具可读性和可维护性。
2. 如果我们使用 malloc 调试库来查找程序中的内存泄漏,那么任何未显式释放的内存都将被报告为内存泄漏。这会使查找真正的内存泄漏的任务复杂化。
3. 避免memory leak.
如果一个函数的 return 值,比如说 myFunc
,是一个分配的 space。父函数还需要释放那部分内存吗?
例如:
char * myFunc() {
return malloc(5);
// free() not called
}
int main() {
char * str = myFunc();
// does str need to be freed?
return 0;
}
建议 释放 str
:将 // does str need to be freed?
替换为 free(str)
。这是避免潜在内存泄漏的良好编程习惯。
在你的例子中,OS 将清理这个短程序占用的分配内存。
To free() or not to free()?
当一个进程终止时,它的所有内存都返回给系统,包括由 malloc 包中的函数分配的堆内存。在分配内存并继续使用直到程序终止的程序中,通常会忽略对 free()
的调用,依靠这种行为来自动释放内存。这在分配许多内存块的程序中特别有用,因为添加对 free()
的多次调用在 CPU 时间方面可能很昂贵,而且代码可能很复杂。
虽然依靠进程终止来自动释放内存对于许多程序来说是可以接受的,但是有几个原因可以解释为什么需要显式释放所有分配的内存:
1.显式调用free()
可能使程序在以后的修改中更具可读性和可维护性。
2. 如果我们使用 malloc 调试库来查找程序中的内存泄漏,那么任何未显式释放的内存都将被报告为内存泄漏。这会使查找真正的内存泄漏的任务复杂化。
3. 避免memory leak.