删除指针并将其设置为nullptr之间的区别是什么?

时间:2015-07-24 20:10:44

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

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

5 个答案:

答案 0 :(得分:10)

pointer = nullptr;就像从名片中删除墨水一样。你不再知道房子的位置,至少不是看那张特定的名片。但房子还在那里。

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

答案 1 :(得分:7)

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

否则

delete pointer;
pointer = NULL;

很好,但是

pointer = NULL;
delete pointer;

不是,因为你已经将指针设置为NULL,delete命令将没有任何东西可以删除(或者它认为)。你现在有一个内存泄漏,因为预先指向的指针(让我们说一个链表)现在浮动在你的记忆中的某个地方,并且程序无法检查。

答案 2 :(得分:3)

  

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

delete表达式调用析构函数并释放内存(,将其返回到免费存储区)。将指针设置为空指针不会执行这些操作,如果没有其他指向对象的指针,则可能会泄漏内存或资源。

  

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

怎么样?

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

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

  

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

不确定你的意思......

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

调用

delete,不仅可以释放对象的已分配内存,还可以调用对象的析构函数。

如果不会调用析构函数,那么该对象仍将保留资源。

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

但一般来说,用户定义类型的对象需要在删除它们时调用它们的析构函数。

指针应指向一个物体。所以在这一系列陈述中没有任何意义

pointer = nullptr; delete pointer;

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