这已成为困扰我多年的事情.
我们都在学校(至少,我是)教过你必须释放每个分配的指针.不过,我有点好奇,关于不释放内存的实际成本.在一些明显的情况下,就像在malloc循环内部或线程执行的一部分中调用时一样,释放是非常重要的,因此没有内存泄漏.但请考虑以下两个例子:
首先,如果我的代码是这样的:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里真正的结果是什么?我的想法是,进程死了,然后堆空间无论如何都没有了,因此错过调用没有任何害处free(但是,我确实认识到无论如何都要将它关闭,可维护性和良好实践的重要性).我对这个想法是对的吗?
其次,假设我的程序有点像shell.用户可以声明类似的变量,aaa = 123并将其存储在某些动态数据结构中供以后使用.很明显,你可以使用一些解决方案来调用一些*alloc函数(hashmap,链表,类似的东西).对于这种程序,在调用之后永远自由是没有意义的,malloc因为这些变量必须在程序执行期间始终存在,并且没有好的方法(我可以看到)用静态分配的空间来实现它.拥有一堆已分配但仅作为流程结束的一部分释放的内存,这是不好的设计吗?如果是这样,有什么替代方案?
可能重复:
在C中退出程序时释放所需的内存
我正在阅读"Freeing Memory Allocated with malloc"页面,并且遇到了这句话:
在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会返回给系统.
我意识到作者试图说的是什么,但句子不应该是:
在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会返回给系统,尽管你仍然应该确保程序在退出之前释放所有malloc的内存.
或者通常的做法是在流程终止之前不取消分配内存?
假设我有一个如下所示的程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc < 2) return 1;
long buflen = atol(argv[1]);
char *buf = malloc(buflen);
fread(buf, 1, buflen, stdin);
// Do stuff with buf
free(buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此类程序通常具有更复杂的清理代码,通常包括对错误处理的多次调用free,有时包括标签甚至清理函数。
我的问题是:free(buf)最后真的有必要吗?我的理解是,当程序退出时,内核会自动清理未释放的内存,但如果是这样的话,为什么在代码末尾放置 free 是一种常见的模式?
BusyBox 提供了一个编译选项来禁用在执行结束时调用 free。如果这不是问题,那么为什么有人会禁用该选项呢?纯粹是因为像 Valgrind 这样的程序在分配的内存未释放时检测到内存泄漏吗?