说delete pointer
和pointer = nullptr
是一样的吗?可能不是,但后者会释放内存吗?那么delete pointer; pointer = nullptr
/ pointer = nullptr; delete pointer
呢?为什么不使用它来提供一种安全的方法来过早地删除指针,如果需要的话,它们通常会在其他时间被删除并导致正常删除时出错?
答案 0 :(得分:10)
pointer = nullptr;
就像从名片中删除墨水一样。你不再知道房子的位置,至少不是看那张特定的名片。但房子还在那里。
delete pointer;
就像拆毁房子一样。名片仍然告诉你那个房子曾经在哪里,但如果你要去那里(取消引用指针),你会看到房子已经消失了。或者更糟糕的是,他们可能同时在该地址建立核废料储存设施。
答案 1 :(得分:7)
它不一样,因为虽然您可能将指针设置为null,但指针指向的内容仍将占用空间。
否则
delete pointer;
pointer = NULL;
很好,但是
pointer = NULL;
delete pointer;
不是,因为你已经将指针设置为NULL,delete
命令将没有任何东西可以删除(或者它认为)。你现在有一个内存泄漏,因为预先指向的指针(让我们说一个链表)现在浮动在你的记忆中的某个地方,并且程序无法检查。
答案 2 :(得分:3)
说
delete pointer
和pointer = 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指针文字。