0

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

所以我的问题是,在程序生命周期结束时单独手动释放每个内存块是否需要更长的时间,还是让系统卸载程序并释放系统给程序的所有虚拟内存会更好同时。

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

4

3 回答 3

0

好吧,如果程序退出,大多数操作系统都会在退出时释放内存,但更大的问题是你为什么希望它必须这样做?

它更快吗?有时很难用记忆说。无论如何,我猜不是真的也绝对不值得打破良好的编码实践。

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

最佳做法是在完成后始终释放内存。在 C 和 C++ 中,每个 malloced 或 new 内存块都应该有相应的 free 或 delete。

依靠操作系统来释放内存是一个坏主意,因为它不仅使您的代码看起来很糟糕,并且降低了可移植性,而且如果该程序曾经集成到另一个程序中,那么您可能会跟踪内存泄漏小时。

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

于 2013-05-21T13:04:14.680 回答
0

维护生命周期短的程序很适合通过“exit() 并让内核对其进行排序”来释放内存。但是,如果该程序将持续超过几个月,则您必须考虑维护负担。

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

于 2013-05-21T13:06:56.167 回答
0

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

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

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

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

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

于 2013-05-21T13:12:20.180 回答