2010-07-23 53 views
11

我的程序(文本模式的Web浏览器)动态分配内存。我应该在异常终止时释放分配的内存吗?

当然,我在运行时会释放不需要的块。在正常的终止之前,我确实释放了所有的东西 - 这样内存泄漏检查器就不会给我带来误报(如果需要进行重大的重构,请灵活处理)。

现在,我做了什么不是做是在异常终止之前释放内存。 (目前,我的程序终止的信号,未能mallocs/reallocs后)。

我的问题是:你认为这种不良作风?我应该释放异常终止吗?

+0

当您的进程终止时,您的系统将回收内存,不是吗? – 2010-07-23 10:13:26

回答

12

不,我认为这是完全可以接受的只是扔了你的手,让操作系统回收内存的程序结束之后。我认为,如果这确实是一种不正常的情况,并且意图是让程序终止,那么一个行为良好的程序应该简单地清理所有磁盘资源/锁,并尽快退出。

4

在我看来,释放内存崩溃是没有必要的。当你的进程终止时,OS将回收内存,所以你所要做的就是退出。

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

0

的过程异常终止不会导致不能被其他进程使用(有效地意味着它们是免费的)的内存块,如果他们被分配它。

我们使用OS-指令,以便非马车OS跟踪MEM块用于每个进程的并将它们转换成一个连续虚拟内存空间分配/释放存储器。在进程死亡后,OS加载程序发出信号,所有内存都被调用。当进程共享内存时情况变得复杂。

凝视的过程,如果没有衍生/启动/由你处理分叉(例如考虑为许多进程访问多媒体资源的外部组件),可能有创建的存储器(例如,缓冲器),以满足您的过程。取决于这些外部组件的所有权策略,这个内存在服务进程死亡时可能不是免费的。

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

0

仅当您的操作系统在程序终止时不回收内存时。 DOS和它的“粘性内存”就是这种操作系统的一个例子。对于大多数现代操作系统来说,不是免费的()异常终止是不成问题的。

+0

DOS在程序终止时不会回收什么样的内存? – unbeli 2010-07-23 10:48:16

+0

Hrm。你确定这是真的吗? – Gian 2010-07-23 10:52:29

+0

我确定至少有一个MSDOS和CP/M的BDOS变体是真的 - 它们支持所谓的“粘滞内存”,程序可以分配空间,并且即使在它终止后仍保持分配。此外,MSDOS中的TSR调用也取得了类似的结果,但我不认为它是“异常终止”。 – 2010-07-23 11:04:44

0

不,除非你的程序总是异常终止。 :) 无论如何,操作系统做了一个很好的工作释放它。实际上,许多懒惰的程序员甚至不会用正常的终止来解放事物 - 但这使得检测其他内存泄漏变得困难(那些是真正的问题)。

3

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

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

0

异常终止时,您希望尽可能少地处理异常终止。最大限度地减少中止过程的修补将意味着你可以尽可能接近中止的原因,并且任何进一步的处理可以被看作是“污染”过程,从而使其更难以调试。