为什么我要 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将在进程终止后释放进程使用的所有资源。但是很多程序都不是短命的。