【问题标题】:What happens if I don't 'delete'? [duplicate]如果我不“删除”会怎样? [复制]
【发布时间】:2021-06-06 16:13:44
【问题描述】:

如果我在执行期间分配了一些内存但从未调用delete 并且程序终止会发生什么?操作系统会释放我分配的所有内存并且不会“浪费”任何内存吗?或者在计算机重新启动之前我会丢失一部分内存吗?

显然,我知道良好的编码习惯是确保删除不需要的内容,所以我不只是问“delete 有什么意义”;我只是想知道我的 RAM 中发生了什么。

【问题讨论】:

  • 释放内存以便操作系统可以再次使用它。当您的程序终止时,所有内存将被自动释放,但是,它值得释放,因此在您的进程的生命周期内使用内存以保持它具有较低的内存占用。
  • 谢谢,这正是我认为发生的事情。
  • 一个问题,你应该......忘记它。只是...新建和删除。总是。总是!总是!
  • 是的,请再次阅读问题。我已经说过我知道了。
  • 我只是放在这里:what if...

标签: c++ memory-management


【解决方案1】:

这完全取决于您的程序做什么,以及它使用了多少内存 - 在任何给定时间以及整个运行时的整体情况。

假设您编写了一个邮件服务器,它分配内存来保存它收到的每封电子邮件。但它实际上并不需要存储通过它的每封电子邮件。因此,在接收和转发电子邮件几天后,邮件服务器无法分配更多内存,它已经消耗了所有可用的内存字节 - 但它实际上并没有对该内存做任何有用的事情,因为不再使用电子邮件- 他们已经被处理了。

另一方面,如果我们编写邮件服务器程序,例如分配 1 MB 的缓冲区来读取一封电子邮件,对其进行处理,然后在处理完成后,将内存重新用于另一封电子邮件,那么几乎没有永远释放那段记忆。

如果我们编写一个程序,只读取一个文件,将整个文件加载到内存中,当它为统计目的计算完所有字母后,打印统计信息并退出,无论是否分配大量内存都不会没关系。

当然,所有这些都假设调用new 只是为了分配内存。如果对象的构造函数做了一些更复杂的事情,比如打开文件、获取锁或其他事情,那么如果不调用析构函数,那么很快就会发生各种坏事。

操作系统将(对于常用的操作系统,如 Linux、macOS、iOS、其他 Unix 系统、Windows、DOS、OS/2 等)释放您的应用程序使用的内存。

【讨论】:

    【解决方案2】:

    当进程终止时,操作系统会释放分配给进程的所有内存。因此,一旦程序终止,您的程序分配的内存将被操作系统释放和回收。

    【讨论】:

    • 只有具有虚拟内存管理器的操作系统(当今使用的大部分操作系统)才会出现这种情况,但例如,它不适用于某些实时操作系统。
    【解决方案3】:

    从概念上讲,你会泄漏内存。

    在实践中,不过,如果您有一个健全的操作系统,它很可能会在您的进程之后清理。但不要依赖它,真的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-21
      • 2014-07-24
      • 1970-01-01
      • 2013-08-31
      • 2015-12-29
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多