12

我的程序(文本模式的网络浏览器)正在动态分配内存。

当然,我会在运行时释放不需要的块。而且我会在正常终止之前释放所有内容 - 这样内存泄漏检查器就不会给我误报(并且在需要重大重构时保持灵活性)。

现在,我不做是在异常终止之前释放内存。(目前,我的程序在信号和 malloc/reallocs 失败后终止。)

我的问题是:你认为这种不好的风格吗?我应该在异常终止时释放吗?

4

7 回答 7

13

不,我认为在程序终止后简单地举手让操作系统回收内存是完全可以接受的。我认为如果这确实是一种异常情况并且意图是让程序终止,那么一个表现良好的程序应该简单地清理任何磁盘资源/锁,并尽快退出。

于 2010-07-23T10:18:06.603 回答
4

在我看来,没有必要在崩溃时释放内存。当您的进程终止时,操作系统将回收内存,因此您所要做的就是退出。

另一方面,其他资源(例如打开的文件)应该关闭或至少刷新——如果没有,它们可能不会因为缓冲而被存储/存储不完整。

于 2010-07-23T10:23:07.693 回答
3

除了避免泄漏检测工具中的误报之外,您不需要在正常终止时回收内存。

如果您的程序异常终止,根据原因,您可能会发现无法释放内存。例如,由损坏的堆导致的 SIGSEGV 意味着即使尝试释放堆上的其他东西也可能是无望的练习。

于 2010-07-23T11:10:12.927 回答
0

进程的异常终止不会导致其他进程无法使用的内存块(实际上意味着它们是空闲的),如果它们是由它分配的。

我们使用操作系统指令分配/释放内存,以便非错误操作系统跟踪每个进程的内存块并将它们转换为连续的虚拟内存空间。在进程死亡时,操作系统加载程序会发出信号,并且所有内存都会被调用。当进程共享内存时,事情会变得复杂。

对等进程,如果不是由您的进程派生/启动/分叉(例如,考虑为许多进程提供访问多媒体资源的外部组件),可能已经创建了内存(例如缓冲区)来为您的进程提供服务。根据这些外部组件的所有权政策,在服务进程死亡时,该内存可能不会空闲。

我建议您尝试审核在异常终止情况之前和之后提交的所有内存。

于 2010-07-23T10:37:03.043 回答
0

仅当您的操作系统在程序终止时不回收内存时。DOS 及其“粘性记忆”就是这种操作系统的一个例子。在大多数现代操作系统上,异常终止时的非 free()'ing 不是问题。

于 2010-07-23T10:44:31.050 回答
0

不,除非您的程序总是异常终止。:) 无论如何,操作系统在释放它方面做得很好。事实上,许多懒惰的程序员甚至都懒得用正常的终止来释放东西——但这使得检测其他内存泄漏变得困难(那些是真正的问题)。

于 2010-07-23T10:45:30.297 回答
0

在异常终止时,您希望尽可能少地进行处理。尽量减少对中止过程的修改将意味着您可以尽可能接近中止的原因,并且任何进一步的处理都可以被视为“污染”过程,从而使其更难以调试。

于 2010-07-23T15:09:51.420 回答