程序退出后,动态分配的2D数组是否会自动删除?

时间:2018-10-29 19:18:52

标签: c++11

我现在正在学习析构函数,因为我正在做关于矩阵的分配(我们应该做一个Matrix类,并重载运算符来执行Matrix运算,而我和我接下来要提到的人是还计划使其执行高斯-乔丹消除法(如果有必要的话),并通过动态2D数组在此分配中表示。

我听说有人谈论使用析构函数进行数组的删除过程。我开始阅读有关析构函数的信息,其中一个事件称为析构函数,这似乎是析构函数唯一在此类应用程序中使用的事件是程序的终止,因此我对他为什么会感到困惑需要一个析构函数?像这样的应用程序中的析构函数有什么意义?

1 个答案:

答案 0 :(得分:2)

标题中问题的答案是:

是。还有。

否:

如果进程使用new创建了一个对象,并且终止了该对象而未在同一对象上调用delete,则该对象永远不会被破坏。 析构函数将不会执行的任何操作

此操作可能是保持外部数据一致性所必需的。就像将内容推送到数据库一样。或像将缓存刷新到磁盘一样。错过什么动作完全取决于析构函数。

是:

该进程占用的内存不会丢失给系统。您的进程从系统内核请求了一些内存块,以便它能够在该内存中构造其对象。内核会跟踪它已分配给哪个进程的内存页,并且它一点也不在乎该进程对它做了什么。内核完全不了解在内存中构造了哪些对象。

当进程退出时,内核将简单地回收仍分配给该进程的所有内存。因此,您不会通过在关机时忘记delete个对象来永久地释放内存。

但是,此回收仅影响内存使用。任何未刷新的缓存的内容均不刷新。并且当进程终止时处于不一致状态的外部文件将永远保持该不一致状态。


因此,最重要的是:内核仍然会回收内存。但是,忘记清理通常不是一个好主意。最好不要养成懒惰的习惯,因为这种习惯会严重地咬住你。