在用C ++编写的进程的出口处堆内存和操作系统

时间:2010-12-15 11:19:08

标签: c++ memory-management memory-leaks

我对操作系统在流程生命周期方面的作用存有疑问。我正在使用Linux。

假设我有一个使用new在堆中创建一组对象的应用程序。在应用程序的生命周期中,我不需要删除任何这些对象,除非在退出应用程序或退出之前进行清理。

假设我没有在应用程序的末尾为所有这些对象调用delete,通常操作系统会回收/释放所有分配的堆,以便在进程退出时再次使用它吗?如果进程因异常或调用返回或退出而退出,是否总会发生这种情况?

如果这是真的,这意味着如果我不调用delete,则不会对操作系统或机器上运行的其他应用程序产生任何影响。正确?

我通常使用boost shared pointers或使用delete但我想在操作系统/ Linux环境中澄清这个疑问

亲切的问候 AFG

5 个答案:

答案 0 :(得分:5)

这是正确的。在受保护模式操作系统上的进程生命周期之后的任何内存泄漏都是内核中一个非常讨厌的错误(有时会发生崩溃)。

话虽如此,检查内存泄漏的最简单方法是确保堆在执行结束时具有与执行开始时完全相同的已分配单元数。如果退出时没有delete,则无法检查此内容,也永远不会发现合法的内存泄漏。

答案 1 :(得分:3)

现代操作系统回收封闭过程的所有资源。不仅是内存,还有文件句柄等。

答案 2 :(得分:2)

不用担心,操作系统回收所有内存。您需要注意的是将一些持久性资源(例如文件)留在不确定状态。

仅供参考我的编程语言在默认情况下故意无法释放内存:它的速度更快。但是不允许使用RAII。在C ++中,如果你使用RAII,那么你需要更加小心。

答案 3 :(得分:0)

如果程序不调用已创建对象的析构函数或不释放内存或其他操作系统句柄,则快速回答不会对操作系统造成损害。退出之前程序编写的部分文件会丢失最大的影响。

因此,Herb Satter在他们的书中写了关于技术,即短期应用程序特别不释放内存,不要将析构函数称为最大执行速度。

但更好的是,程序通常会处理其使用过的操作系统资源。

(抱歉我的英文)

答案 4 :(得分:0)

您需要更加小心其他资源,如文件句柄,数据库连接等。但是,所有内存都可以回收。