退出前我应该释放内存吗?

问题描述 投票:16回答:5

因为错误而退出程序时,我应该释放所有我的mallocated内存吗?

something = (char**) malloc (x * sizeof(char*));
for (i = 0; i < x; i++)
    something[i] = (char*) malloc (y + 1);

...

if (anything == NULL) {
   printf("Your input is wrong!");
   // should I free memory of every mallocated entity now?
   exit(1);
} 
else {
   // work with mallocated entities
   ...
   free(something); // it must be here
   system("pause);
}
c malloc free dynamic-allocation
5个回答
5
投票

这取决于操作系统。最好的做法我会说你应该明确地释放它。它还使得像valgrind这样的工具使用PITA,如果你的内存没有被释放,我无法分辨出什么是好的和坏的等等。

如果在明确释放内存的操作系统上,您仍然遇到其他资源的问题。随着您的应用程序开始增长并吸引第三方库,您可能会遇到资源泄漏。想象一下,我写了一个库,要求你在一个处理程序上调用close。除非您调用close,否则此处理程序恰好由不会被删除的临时文件支持。或者我已经分离了在后台运行的进程,我正在使用信号或其他您不知道的资源进行管理。


12
投票

这实际上是一个非常困难,无法估量的问题。

Pro(支持在退出前释放所有内容):

  • 如果重新安排代码,以后不会出现错误或内存泄漏
  • valgrind或内存泄漏检查器没有误报
  • 如果你在一个有缺陷的操作系统下运行,或者根本没有操作系统,则没有内存泄漏

Con(只需退出,不要担心释放一切):

  • 释放一切可以做很多工作
  • 释放一切可以引入错误和崩溃
  • 你的操作系统确实应该在退出时为你收回所有资源

最后,您必须决定哪些优点和缺点对您最重要。不同情况下不同项目的不同程序员会得出不同的结论;这里没有一个通用的答案。

另见question 7.24中的C FAQ list


9
投票

在程序终止之前,您不需要释放内存。以任何方式终止程序会导致所有内存自动解除分配。


5
投票

在退出之前,应始终释放已分配的内存。正如其他答案中已经提到的,这将最大限度地减少静态或动态分析工具等的警告。

但是你应该总是这样做的真正原因是因为释放经常暴露应用程序中的休眠运行时错误。

如果某个地方有一个导致内存损坏或更改指针地址的错误,那么该错误可能会保持沉默并处于休眠状态。直到你改变与bug完全无关的东西,从而改变内存布局。然后你突然崩溃了,你也不知道为什么,因为这个bug甚至没有出现在你刚添加的代码中。

通过释放内存,你会引发这样的错误。因为如果堆有任何问题或指针指向堆,那么你经常会在调用free()时发生崩溃。这意味着您在运送程序之前需要找到一个严重的错误。


0
投票

我有完全相反的情况:来自第三方库的静态对象的segfaulting析构函数。只是因为在退出之前显式释放了内存池。我相信,合理并专注于计划结构更好。

© www.soinside.com 2019 - 2024. All rights reserved.