为什么我要释放由malloc()分配的对象?

为什么我要释放由malloc()分配的对象?,c,memory-management,malloc,heap-memory,free,C,Memory Management,Malloc,Heap Memory,Free,我一直被告知要释放malloc()分配的堆内存: #包括 #定义宽度5 内部主(空) { char*ptr=malloc(sizeof(*ptr)*宽度); /*一些关于heap对象的东西*/ 免费(ptr); 返回0; } 但现在我已经读到,我不必这样做,因为程序终止后,操作系统会自动释放占用的内存 但是为什么我的老师要我这么做呢?这样做有什么好处吗?在您的示例中,这无关紧要,因为正如您所说,当程序退出时,操作系统将为您清理 但强烈建议无论如何都要这样做。一旦你的程序比这个例子稍微复杂一点,

我一直被告知要释放
malloc()
分配的堆内存:

#包括
#定义宽度5
内部主(空)
{
char*ptr=malloc(sizeof(*ptr)*宽度);
/*一些关于heap对象的东西*/
免费(ptr);
返回0;
}
但现在我已经读到,我不必这样做,因为程序终止后,操作系统会自动释放占用的内存


但是为什么我的老师要我这么做呢?这样做有什么好处吗?

在您的示例中,这无关紧要,因为正如您所说,当程序退出时,操作系统将为您清理

但强烈建议无论如何都要这样做。一旦你的程序比这个例子稍微复杂一点,你就会遇到这样的情况,你必须释放你分配的内存来避免内存

当您分配了内存,但不再持有指向它的任何指针,并且您的程序仍在运行时,就会发生内存泄漏。由于C没有垃圾收集,在程序退出之前,语言和操作系统都不会清理这个内存,因为它无法知道您打算清理它,因为您没有调用
free()
。如果您打算编写长时间运行的程序,这将是非常有问题的

但是为什么我的老师要我这么做呢?这样做有什么好处吗

想想如果你的程序是一个长时间运行的进程,比如说,一个数据库服务器,并且在它的内部某处有一个函数,它会不断分配内存,比如说,每次处理一个查询时,它都不会释放内存。或者,更普通的是,一个桌面应用程序,比如一个文字处理器,您希望在处理某些事情时保持运行


是的,操作系统将在进程终止后释放进程使用的所有资源。但许多项目都不是短期的。

这是一种很好的做法。一旦您开发了分配大量内存的大型程序,您需要确保在不再需要时释放内存,否则您的大型程序可能会耗尽内存。此外,能够毫无问题地释放所有分配的内存,并通过堆检查终止您的程序,以确保没有内存丢失,这意味着你的程序没有或很少出现内存错误。你问的问题是,为什么你的老师让你释放内存,即使通用操作系统回收内存,这个问题在你引用的链接中得到了回答。正如它所说的,在管理内存的操作系统上的进程退出之前,没有绝对必要释放内存,但这是帮助避免错误(例如无法在循环中释放内存,导致浪费内存和可能耗尽系统资源的“泄漏”)以及使代码更容易修改和重用的良好实践(例如在一个程序中获取大部分代码,并将其放入另一个程序中的子例程)那么,你的问题为什么不应该作为一个副本来关闭呢?而且,在实践中经常会因为释放内存经常缠绕在一个进程的其他方面,比如刷新文件缓冲区。C中没有智能指针。C++只会混淆OP。我认为它会有帮助而不是混淆。G提到C++,因为它希望帮助OP理解他所困惑的问题空间,这不限于C。这发生在我编写的数独蛮行者中。我会在每次检查(25字节)上长出一个int数组长度为100,最后吃了15 GB RAM和2 GB的SavaFipe,在解决任何问题之前崩溃程序。
#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;
}