释放多个大串记忆值得吗?

时间:2013-05-21 12:31:46

标签: memory memory-management

比如说我编写了一个程序,它在初始化时分配了一堆大对象。然后程序运行一段时间,也许是无限期的,当它终止时,每个大的初始化对象都被释放。

所以我的问题是,在程序结束时分别手动解除分配每个内存块需要更长时间,还是让系统卸载程序并释放给程序的所有虚拟内存更好?由系统同时进行。

它会安全和/或更快吗?另外,如果它是安全的,编译器在设置为优化时是否会这样做?

3 个答案:

答案 0 :(得分:0)

大多数操作系统会在程序退出时释放内存,但更大的问题是为什么你要它必须要?

更快吗?很难用记忆说。我猜不会真的,绝对不值得破坏良好的编码实践。

安全吗?定义安全......您的操作系统会崩溃吗?可能不是。您的代码是否容易受到内存泄漏或其他问题的影响?当然,它会。事实上,你基本上是在告诉它你想要内存泄漏。

最佳做法是在完成操作后随时释放内存。使用C和C ++,每个malloced或新的内存块都应该有相应的free或delete。

依靠操作系统来释放你的记忆是一个坏主意,因为它不仅会使你的代码看起来很糟糕并且不那么便携,而且如果程序被集成到另一个程序中,那么你很可能会追踪到内存泄漏数小时。

所以,简短的回答,总是手动完成。

答案 1 :(得分:0)

具有较短维护生命周期的程序是“exit()的内存释放的良好候选者,并让内核对它们进行排序。”但是,如果该程序将持续超过几个月,您必须考虑维护负担。

例如,考虑到某人可能意识到程序中需要后续阶段,并且不需要某些数据,或者内存中不需要某些数据。他们现在必须去了解如何释放内存,正确删除过时的引用等。

答案 2 :(得分:0)

1)当应用程序终止时,并非所有系统都会为您释放内存。当然,大多数现代桌面系统都会这样做,因此如果您只在Linux或Mac(或Windows)上运行程序,则可以将解除分配留给系统。

2)通常需要在终止时对数据进行一些操作,而不仅仅是释放内存。因此,如果您要开发这样的程序设计,使得最后手动解除对象很难,那么以后您可能需要在退出之前执行一些代码,并且您将面临难题。

2')有时即使你认为你的程序需要一些对象直到死,以后你可能想要从你的程序创建一个库或更改一个项目来加载和卸载你的大对象和糟糕的设计你的程序将使这很难或不可能。

3)此外,程序释放性能取决于您将在程序中使用的分配器的实现。系统解除分配取决于系统内存管理,即使对于单个系统,也可以有多个实现。因此,如果您面临分配/解除分配性能问题 - 您希望开发更好的分配器,而不是希望系统。

4)所以我的观点是:当你最后手动释放内存时 - 你总是在正确的方式。如果你不这样做,也许你可以在几种情况下获得一些模棱两可的好处,但很可能你迟早会面临这些问题。