【问题标题】:What does the use of new require you to also call delete?new 的用途是什么要求你也调用 delete?
【发布时间】:2012-03-29 06:36:28
【问题描述】:

我在我的 C++ 书中遇到了一个问题:

“new 的使用要求你也调用 delete 有什么用?”

也许你对此有答案?

【问题讨论】:

  • 答案肯定也在你的书中。虽然有人可以(并且将)在这里提供它,但自己回答并不难。如果您已这样做但需要确认,请编辑问题并告诉我们您为什么认为它会这样做。
  • 我在找,只是讨论问题
  • 我认为您的意思是“为什么”,而不是“什么”。

标签: c++ oop new-operator delete-operator


【解决方案1】:

因为这是 C++ 的设计方式,也是预期的行为。
目的是提供您需要并拥有的内存分配,直到您明确放弃它。

new 为您提供动态内存分配(在堆上),它将继续存在并且您拥有它,直到您通过调用 delete 显式取消分配它。
未能在newed 缓冲区上调用delete 将导致未定义行为,通常以 的形式出现。 1 内存泄漏。

1 讨论过here

【讨论】:

  • 哦,好吧,我猜这就是他们正在寻找的,如果你不再次删除对象,内存泄漏的想法。
  • 这是不正确的。不调用 delete 并没有未定义的行为,并且在某些情况下(例如单例)您不想在 newed 内存上调用 delete
【解决方案2】:

当您执行new 时,操作系统会将内存分配给您分配给它的指针。使用完成后,您可能不再需要它。但是内存仍然被操作系统标记为“正在使用”。

现在,当指针在函数或任何其他块({})的范围内声明时,当块执行结束时,它将被删除(仅删除指针)。在这种情况下,使用new 分配的内存仍然被操作系统标记为“正在使用”,并且不会分配给任何其他调用new 的指针或变量。这会导致 RAM 中出现一个孤立的内存块,该内存块永远不会被使用,因为它的指针已从内存中删除,但它将占用一个内存块。

这称为内存泄漏。一些这样的块也可能使您的应用程序不稳定。

您使用delete 来释放这些内存块并释放操作系统,以便它可以很好地用于其他请求

【讨论】:

    【解决方案3】:

    C++ 中没有垃圾收集器,因此您负责释放分配的内存。无论如何,操作系统“知道”你的程序分配了什么内存。因此,当您的程序退出时,操作系统再次负责内存。但是,如果您有一个长时间运行的 C++ 程序并且从不调用 delete,那么没有人会帮助您摆脱垃圾。

    【讨论】:

    • 您可以在 C++ 中使用垃圾收集器。但是delete 超越了简单的内存管理;它也调用析构函数。即使有垃圾收集器,也经常需要使用delete
    【解决方案4】:

    调用 new 已经为对象分配了内存,并且还安排了要执行的对象的构造函数。

    您可以通过调用 free() 来释放内存,但实际上应该使用 delete 来释放由 new 分配的内存,因为这也会导致对象的析构函数被执行。

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 2018-03-25
      • 2010-09-26
      • 2014-01-20
      • 1970-01-01
      • 2014-04-15
      • 2020-10-10
      • 2014-02-21
      相关资源
      最近更新 更多