【发布时间】:2018-07-03 23:52:32
【问题描述】:
假设我有一个类似下面的程序
#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;
}
此类程序通常具有更复杂的清理代码,通常包括对free 的多次调用,有时还包括用于错误处理的标签甚至清理函数。
我的问题是:最后的free(buf) 真的有必要吗?我的理解是,程序退出时内核会自动清理未释放的内存,但如果是这样,为什么在代码末尾放 free 这么常见的模式?
BusyBox 提供了一个编译选项,可以在执行结束时禁用免费调用。如果这不是问题,那么为什么有人会禁用该选项?纯粹是因为像 Valgrind 这样的程序会在分配的内存没有释放时检测到内存泄漏吗?
【问题讨论】:
-
有必要吗?在大多数情况下没有。但自己打扫卫生是个好习惯。
-
要添加到前面的评论,假设您使用不同的小程序(例如您的示例)一起构建另一个更大的程序/应用程序。或者以某种方式将它变成一个持续运行并多次执行您的功能的守护程序。如果您没有添加任何
free,则在将各个部分组合在一起/使其循环运行时很容易忘记添加它。现在你的程序有严重的内存泄漏。
标签: c memory-management