【问题标题】:Free() before return 0;返回 0 之前的 Free();
【发布时间】:2016-04-14 05:07:33
【问题描述】:

如果我通过传递 return 0 来结束执行会发生什么;在使用 malloc 并且没有释放分配的内存部分之后?

int * var;
var = (int *)malloc(sizeof(int)) ;
free(var) ;
return 0;

【问题讨论】:

  • 如果你在堆上分配内存并且不释放它,你的程序中有内存泄漏
  • 如果您的意思是在不清理所有内容的情况下结束程序,在大多数情况下这不会是一个大问题。不过不要依赖这个。这仍然是内存泄漏。
  • 什么是内存泄漏?
  • 我对许多反对票感到有些惊讶。在我看来,这是一个合理的问题,尤其是在 OP 不熟悉内存泄漏的明显背景下。
  • 也许他们认为每个人生来就无所不知。

标签: c


【解决方案1】:

它是特定于实现的。

在大多数 operating systems(尤其是桌面或服务器操作系统,例如 Linux、MacOSX、Windows...)上,一旦 process 终止,所有使用的资源都会被释放,其中包括其 virtual address space。因此,即使 unfreed 堆内存也会被释放。

特别是,如果您编写一个快速运行的程序(例如,您知道它总是会在几秒钟内运行),那么接受一些memory leak 可能会更容易(但如果您做,请在您的代码和/或文档中评论)。许多现实生活中的程序都在这样做(尤其是GCC 编译器,可能还有几个Unix shells)。

相反,如果您正在编写服务器(例如数据库或计算服务器),您应该避免任何内存泄漏,这会使服务器的进程RSS 无限增长(直到崩溃)。您通常应该非常小心,在回复该请求后,为处理一个请求而分配的每个堆内存都会获得free-d。

在某些嵌入式操作系统上,如果您没有明确释放所有资源(free 所有堆分配的内存,fclose 所有打开的流)并且正确地释放了resource leak

另请参阅this 相关问题。在许多操作系统(包括 Linux)上,您可以使用 valgrind 来查找内存泄漏错误。对于最近的gcc,您可以使用debugging options,例如-g -fsanitize=address

还请阅读(至少对于概念和术语)有关garbage collectionfragmentation 的内容。如果使用 C 编程,您可以考虑使用Boehm's garbage collector

然而,系统地free 所有以前的malloc-ed 内存有一个很好的实际理由:这是一门很好的编程学科,使用像valgrind 这样有助于调试真正的内存错误的工具有很大帮助。它还使您的代码更干净,并且您可以在某些不同的上下文中重用它(例如,作为某些库的一部分,可用于长时间运行的进程)。

【讨论】:

  • 实际上,我在几个程序中都使用了 Boehm 的 GC,并且在实践中效果出奇的好
【解决方案2】:

程序包含内存泄漏,如here 所述。具体回答问题,内存泄漏的影响取决于环境;在最好的情况下,什么都不会发生,在最坏的情况下,机器可能迟早会崩溃。内存泄漏的存在无论如何都应该被视为一个bug。

【讨论】:

    【解决方案3】:

    如果您不释放内存,您的应用程序将会发生内存泄漏。因此,如果您不释放内存并让应用程序打开几天,它就会开始变慢,并最终崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 2016-07-08
      • 1970-01-01
      • 2016-08-24
      • 2015-05-30
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多