【问题标题】:Why do I free() an object allocated by malloc()? [duplicate]为什么我要释放()由malloc()分配的对象? [复制]
【发布时间】:2020-05-12 01:05:09
【问题描述】:

我总是被告知要释放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? 中看到我不必这样做,因为操作系统会在程序终止后自动释放占用的内存。

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

【问题讨论】:

  • 这是非常好的做法。一旦您开发了分配大量内存的大型程序,您需要确保在不再需要时释放内存,否则您的大型程序可能会耗尽内存。
  • 此外,能够毫无问题地释放所有分配的内存并通过堆检查以确保没有内存丢失来终止您的程序,这意味着您的程序没有或很少有内存错误的机会。
  • 你提出的问题——为什么你的老师告诉你释放内存,即使通用操作系统回收它——在你引用的链接中得到了回答。正如它所说,在管理内存的操作系统上,没有绝对需要在进程退出之前释放内存,但这是帮助避免错误的好习惯(例如未能在循环中释放内存,导致“泄漏”)浪费内存并可能耗尽系统资源)以及使代码更容易修改和重用(例如将程序中的大部分代码放入另一个程序中的子程序中)。
  • 那么为什么您的问题不应该作为重复项关闭呢?另外,请注意,在实践中经常存在little benefit to neglecting to free memory and letting the operating system do it,因为释放内存通常与结束进程的其他方面纠缠在一起,例如刷新文件缓冲区。

标签: c memory-management malloc heap-memory free


【解决方案1】:

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

想想如果你的程序是一个长时间运行的进程(比如数据库服务器)会发生什么,并且在它的内部某个地方有一个不断分配内存的函数——比如每次处理查询时——但是永远不会释放它。或者,更普通的一种桌面应用程序,例如文字处理器,您希望在处理某事时继续运行它。

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

【讨论】:

  • 这发生在我写的数独暴力破解器中。我会在每次检查时 malloc 一个长度为 25 的 int 数组(约 100 个字节),最终吃掉了 15 GB 的内存和一个 2 GB 的交换文件,在解决任何问题之前使程序崩溃。
【解决方案2】:

在你的例子中没关系,因为正如你所说,当程序退出时操作系统会为你清理。

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

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

【讨论】:

  • C中没有智能指针,引用C++只会混淆OP。
  • 我认为提及 C++ 会有所帮助而不是令人困惑,因为它有望帮助 OP 理解他所困惑的问题空间,而不仅限于 C。
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多