为什么我要 free() 一个由 malloc() 分配的对象?
Why do I free() an object allocated by malloc()?
我总是被告知释放 malloc()
分配的堆内存:
#include <stdlib.h>
#define width 5
int main(void)
{
char* ptr = malloc(sizeof(*ptr) * width);
/* some stuff with the heap object */
free(ptr);
return 0;
}
但现在我在What REALLY happens when you don't free after malloc?中读到我不必这样做,因为操作系统会在程序终止后自动释放占用的内存。
但是为什么我的老师当时要我这样做呢?这样做有什么好处吗?
在您的示例中,这无关紧要,因为如您所说,操作系统会在程序退出时为您清理。
但强烈建议无论如何都要这样做。一旦你的程序变得比这个例子稍微复杂一点,你就会遇到这样的情况,你必须释放分配的内存以避免内存 leaking.
当您分配了内存但您不再持有任何指向它的指针时,就会发生内存泄漏,并且您的程序仍然是 运行。由于 C 没有垃圾收集,在程序退出之前,语言和 OS 都不会清理此内存,因为它无法知道您打算清理它,因为您没有调用 free()
。如果您打算编写长运行 程序,这将是非常有问题的。
But why did my teacher told me to do so then? Is there any benefit of doing so?
想一想如果您的程序是一个长 运行 进程(例如,数据库服务器)并且在其内部某处有一个不断分配内存的函数(例如,每次)会发生什么它处理一个查询——但从不释放它。或者,更平凡的是,您希望在处理某事时保留 运行 之类的桌面应用程序,例如文字处理器。
是的,OS将在进程终止后释放进程使用的所有资源。但是很多程序都不是短命的。
我总是被告知释放 malloc()
分配的堆内存:
#include <stdlib.h>
#define width 5
int main(void)
{
char* ptr = malloc(sizeof(*ptr) * width);
/* some stuff with the heap object */
free(ptr);
return 0;
}
但现在我在What REALLY happens when you don't free after malloc?中读到我不必这样做,因为操作系统会在程序终止后自动释放占用的内存。
但是为什么我的老师当时要我这样做呢?这样做有什么好处吗?
在您的示例中,这无关紧要,因为如您所说,操作系统会在程序退出时为您清理。
但强烈建议无论如何都要这样做。一旦你的程序变得比这个例子稍微复杂一点,你就会遇到这样的情况,你必须释放分配的内存以避免内存 leaking.
当您分配了内存但您不再持有任何指向它的指针时,就会发生内存泄漏,并且您的程序仍然是 运行。由于 C 没有垃圾收集,在程序退出之前,语言和 OS 都不会清理此内存,因为它无法知道您打算清理它,因为您没有调用 free()
。如果您打算编写长运行 程序,这将是非常有问题的。
But why did my teacher told me to do so then? Is there any benefit of doing so?
想一想如果您的程序是一个长 运行 进程(例如,数据库服务器)并且在其内部某处有一个不断分配内存的函数(例如,每次)会发生什么它处理一个查询——但从不释放它。或者,更平凡的是,您希望在处理某事时保留 运行 之类的桌面应用程序,例如文字处理器。
是的,OS将在进程终止后释放进程使用的所有资源。但是很多程序都不是短命的。