我的程序(文本模式Web浏览器)正在动态分配内存。
当然,我在运行时释放不需要的块。并且我在正常终止之前释放所有内容 - 因此内存泄漏检查器不会给我误报(并且如果需要进行重大重构则要灵活)。
现在,我做的不做的是在异常终止之前释放内存。 (目前,我的程序在信号和mallocs / reallocs失败后终止。)
我的问题是:你认为这种不好的风格吗?我应该免于异常终止吗?
答案 0 :(得分:12)
没有。我认为简单地抛出你的手并让程序终止后OS回收内存是完全可以接受的。我认为如果这是一个真正的异常情况并且意图是让程序终止,那么一个行为良好的程序应该只是清理所有磁盘资源/锁,并尽快退出。
答案 1 :(得分:4)
在我看来,没有必要在崩溃时释放内存。当您的进程终止时,操作系统将回收内存,因此您所要做的就是退出。
另一方面,其他资源(例如打开的文件)应该关闭或至少刷新 - 否则,由于缓冲,它们可能不会被存储/存储不完整。
答案 2 :(得分:3)
除了避免泄漏检测工具中的误报之外,您不需要需要来回收正常终止的内存。
如果您的程序异常终止,根据原因,您可能会发现无法释放内存。例如,由于堆损坏导致的SIGSEGV意味着即使尝试释放堆上的其他东西也许是一种无望的练习。
答案 3 :(得分:0)
过程的异常终止不会导致其他进程无法使用的内存块(实际上意味着它们是免费的),如果它们是由它分配的。
我们使用OS指令分配/释放内存,以便非错误的操作系统跟踪每个进程的mem块并将它们转换为连续的虚拟内存空间。在进程死亡时,OS加载程序发出信号,并且所有内存都会被调用。当进程共享内存时,事情会变得复杂。
对等进程,如果未由您进行派生/启动/分叉(例如,考虑为许多进程提供访问多媒体资源的外部组件),可能已创建内存(例如缓冲区)来为您的进程提供服务。根据这些外部组件的所有权政策,这些内存在服务过程中可能不会自由死亡。
我建议您尝试审核在异常终止方案之前和之后提交的所有内存。
答案 4 :(得分:0)
仅当您的操作系统在程序终止时没有回收内存时。 DOS及其“粘性存储器”就是这种操作系统的一个例子。在大多数现代操作系统上,不是免费的()异常终止是一个无问题。
答案 5 :(得分:0)
不,除非你的程序总是异常终止。 :) 无论如何,操作系统可以很好地解决它。事实上,许多懒惰的程序员甚至不会在正常终止时解决问题 - 但这会使检测其他内存泄漏变得困难(那些是真正的问题)。
答案 6 :(得分:0)