c++11 - 程序退出后会自动删除动态分配的二维数组吗?
问题描述
我现在正在学习析构函数,因为我正在做这个关于矩阵的作业(我们应该创建一个 Matrix 类和重载运算符来执行 Matrix 操作,我和我将在下一节中提到的人也计划使其执行 Gauss-Jordan 消除,如果这是相关的)通过动态 2D 数组在此分配中表示。
我听说有人谈论使用析构函数来删除数组。我开始阅读有关析构函数和调用析构函数的事件之一,这似乎是唯一一次在这样的应用程序中使用析构函数是程序的终止,所以我对他为什么要这样做感到有点困惑需要析构函数吗?在这样的应用程序中,析构函数有什么意义?
解决方案
标题中问题的答案是:
是的。和不。
不:
如果进程创建一个对象new
并终止而不调用delete
同一对象,则该对象永远不会被破坏。任何将由析构函数完成的操作根本就没有完成。
此操作可能是外部数据一致性所需的内容。就像将某些东西推送到数据库一样。或者像将缓存刷新到磁盘。错过了什么动作完全取决于析构函数。
是的:
进程占用的内存不会丢失给系统。您的进程从系统内核请求了一些内存块,以便它能够在该内存中构造它的对象。内核会跟踪它分配给哪个进程的内存页,它并不关心该进程对它做了什么。内核完全不知道在内存中构造了哪些对象。
当一个进程退出时,内核将简单地回收仍然分配给该进程的任何内存。因此,您不会因为delete
在关机时忘记对象而永久丢失内存。
但是,这种回收只会影响内存使用。任何未刷新的缓存内容都不会刷新。并且在进程终止时处于不一致状态的外部文件将永远保持这种不一致状态。
所以,底线:无论如何,内核都会回收内存。但是忘记清理通常不是一个好主意。最好不要养成懒惰的习惯,因为这种习惯会严重影响你。
推荐阅读
- reactjs - 如果你正在做样式化的组件,你如何在 React 中重置 CSS?
- visual-studio-code - Set VS Code Extension Configuration Values During Installation
- smtplib - 如何使用 smtplib 模块发送链接?F 字符串不起作用
- java - 探索 Mockito
- amazon-eks - EKS 和 EFS 的“MountVolume.SetUp 卷失败”
- c++ - 无法复制 c 字符串并存储在新字符数组中
- cuda - P100 上的 dram_write_bytes 结果
- servicestack - 从属性名获取 OrmLite 数据库列名
- angular - 仅在其他字段输入完成时启用字段
- django - 在 Django 中,我可以拥有一个模型字段,其值是一对多关系中的最大值吗?