【问题标题】:What's the difference between delete-ing a pointer and setting it to nullptr? [duplicate]删除指针和将其设置为 nullptr 有什么区别? [复制]
【发布时间】:2015-10-15 14:59:40
【问题描述】:

delete pointerpointer = nullptr 是一样的吗?可能不会,但后者会释放内存吗? delete pointer; pointer = nullptr / pointer = nullptr; delete pointer 呢?如果需要,为什么不使用它来提供一种安全的方法来提前删除指针,因为它们通常会在其他时间被删除并导致正常删除时出错?

【问题讨论】:

    标签: c++ pointers memory heap-memory dangling-pointer


    【解决方案1】:

    delete 的调用不仅是为了释放为对象分配的内存,而且是为了调用对象的析构函数。

    如果不调用析构函数,则对象仍将保留资源。

    当然,基本类型没有析构函数,调用 delete 只会释放基本类型对象占用的内存。

    但一般而言,用户定义类型的对象需要在删除时调用其析构函数。

    并且指针应该指向一个对象。所以这一系列的陈述没有意义

    pointer = nullptr; delete pointer;
    

    因为nullptr 不是对象的有效地址。它是一个 NULL 指针文字。

    【讨论】:

      【解决方案2】:

      pointer = nullptr; 就像去除名片上的墨水。您不再知道房子的位置,至少不是通过查看那张特定的名片。但是房子还在。

      delete pointer; 就像拆房子一样。名片仍然告诉你那所房子曾经在哪里,但如果你开车去那里(取消引用指针),你会看到房子已经不见了。或者更糟糕的是,也许他们同时在那个地址建立了一个核废料储存设施。

      【讨论】:

      • 扩展这个类比,pointer = nulptr; 可以随心所欲,因为还有名片,但没有墨水需要去除,所以它没有不良影响(除了丢失跟踪房子的位置)。在指针已被删除后尝试调用delete pointer; 是不好的,因为您现在正尝试删除不再存在的房屋。在pointer = nullptr 之后尝试调用delete pointer 也很糟糕,因为您现在正在尝试删除房屋而不知道去哪里。
      • @FaithForHumans delete nullptr 被定义为禁止操作。
      【解决方案3】:

      delete pointerpointer = nullptr 是一样的吗?可能不会,但后者会释放内存吗?

      delete 表达式调用析构函数并释放内存(,将其返回到空闲存储区)。将指针设置为空指针两者都不会,如果没有其他指向该对象的指针,则可能会泄漏内存或资源。

      delete pointer; pointer = nullptr/pointer = nullptr; delete pointer?

      如果删除已经为空的指针,则没有效果。所以前者销毁对象并释放内存,然后将指针设置为null,而后者仍然泄漏,因为删除没有效果。

      有些人建议在删除后将指针设置为null,这样如果由于错误而再次删除它,它不会使程序崩溃。我个人不推荐这个;我认为删除一个指针两次是一个错误,即使它第二次没有效果,而且如果程序崩溃,那很好,这样你就可以找到并修复那个错误。

      如果需要,为什么不使用它来提供一种安全的方法来过早删除指针,因为它们通常会在其他时间被删除并导致正常删除时出错?

      不知道你的意思...

      【讨论】:

        【解决方案4】:

        删除指针会释放指针指向的内存。只需将指针设置为nullptr 就会导致内存泄漏,因为现在无法删除指针指向的内存。

        您可以在 delete 之后设置一个指向 nullptr 的指针,因为它告诉您指针现在不指向任何内容,如果您不小心再次调用 delete 它是一个非操作,您的程序将继续运行。

        【讨论】:

          【解决方案5】:

          不一样,因为虽然您可能将指针设置为空,但指针指向的内容仍然会占用空间。

          在做

          delete pointer;
          pointer = NULL;
          

          很好,但是

          pointer = NULL;
          delete pointer;
          

          不是,因为您已经将指针设置为 NULL,delete 命令将没有可删除的内容(或者它认为)。您现在发生了内存泄漏,因为无论之前指向的指针(比如说一个链表)现在都浮动在您的内存中的某个位置并且程序无法跟踪。

          【讨论】:

          • 但是使用delete pointer; pointer = nullptr 是否会在尝试删除已删除的指针时不会吓坏它?这有什么问题吗?
          • 你没有得到它。将指针设置为 null 并不是删除它。它只是将它设置为指向 null。
          • 在删除之前设置指针 = NULL 然后删除可能会导致意外行为,具体取决于实现。
          • 将指针设置为 null 不会“删除”它。指针指向的内存仍然被分配并被系统标记为正在使用。你刚刚告诉你的代码忘记它在哪里 - 所以现在你泄露了一些内存。你的应用程序不知道内存在那里,因为你忘记了它,所以你不能“释放”它。并且内存系统不会为你释放它,因为它不知道你正在使用这个内存做什么或者你已经完成了它。
          • @Omega 删除指针;指针 = nullptr。只是删除指针。删除后将其设置为null即可。为指针设置 null 与删除不同。
          猜你喜欢
          • 1970-01-01
          • 2013-05-10
          • 1970-01-01
          • 2023-03-17
          • 2011-04-19
          • 2016-08-23
          • 2015-02-07
          • 2011-04-04
          • 2010-12-17
          相关资源
          最近更新 更多