c-我应该在退出前释放内存吗



当我在中退出程序时,是否应该释放所有被损坏的内存?

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);
}

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

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

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

Con(退出即可,不用担心释放所有内容):

  • 解放一切可能是一项艰巨的工作
  • 释放所有内容可能会导致错误和崩溃
  • 你的操作系统真的,真的应该在你退出时为你回收所有资源

还有一点(不确定是赞成还是反对):在大多数系统上,调用free不会将内存返回到操作系统(只有退出才能这样做)。

最后,你必须决定这些利弊中哪一个对你最重要。不同的程序员在不同的情况下对不同的项目会得出不同的结论;这里没有一刀切的答案。

另请参阅前面的"堆栈溢出"问题。另请参见C常见问题列表中的问题7.24。

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

但您应该始终这样做的真正原因是,释放经常会暴露应用程序中休眠的运行时错误。

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

通过释放内存,你会让这些bug浮出水面。因为如果堆或指向堆的指针有任何问题,那么您通常会在调用free()时发生崩溃。这意味着你在某个地方有一个严重的bug,你需要在发布程序之前找到它。

程序终止前不需要释放内存。以任何方式终止程序都会导致所有内存自动释放。

这取决于操作系统。最佳实践我认为你应该明确地释放它。如果你的内存没有被释放,并且我分不清什么是好的和坏的,那么使用valgrind这样的工具也是一种PITA。

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

我有完全相反的场景:从第三方库中分割静态对象的析构函数。只是因为在退出之前显式释放了内存池。我认为,最好是合理的,集中精力在程序结构上。

相关内容

  • 没有找到相关文章

最新更新