C++ 什么';删除指针和将其设置为NULL PTR之间的区别是什么?

C++ 什么';删除指针和将其设置为NULL PTR之间的区别是什么?,c++,pointers,memory,heap-memory,dangling-pointer,C++,Pointers,Memory,Heap Memory,Dangling Pointer,所说的delete pointer和pointer=nullptr是否相同?可能不会,但后者会释放内存吗?关于删除指针;指针=nullptr/指针=nullptr;删除指针?如果需要的话,为什么不使用这一方法来提前删除指针呢?如果指针通常会在其他时间被删除,并在正常删除时导致错误?这是不同的,因为虽然您可能会将指针设置为null,但指针指向的内容仍会占用空间 做 很好,但是 pointer = NULL; delete pointer; 不是,因为您已经将指针设置为NULL,所以delete命

所说的
delete pointer
pointer=nullptr
是否相同?可能不会,但后者会释放内存吗?关于
删除指针;指针=nullptr
/
指针=nullptr;删除指针
?如果需要的话,为什么不使用这一方法来提前删除指针呢?如果指针通常会在其他时间被删除,并在正常删除时导致错误?

这是不同的,因为虽然您可能会将指针设置为null,但指针指向的内容仍会占用空间

很好,但是

pointer = NULL;
delete pointer;

不是,因为您已经将指针设置为NULL,所以
delete
命令将没有要删除的内容(或者它认为是这样)。现在出现内存泄漏,因为指针之前指向的任何东西(比如链表)现在都在内存中的某个位置浮动,程序无法跟踪。

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

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

所说的
delete pointer
pointer=nullptr
是否相同?可能不会,但后者会释放内存吗

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

关于
删除指针;指针=nullptr
/
指针=nullptr;删除指针?

如果删除已为null的指针,则不会产生任何效果。因此,前者销毁对象并释放内存,然后将指针设置为null,而后者仍然泄漏,因为删除没有效果

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

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


不确定你的意思…

代码>指针=nullptr就像从名片上取下墨水一样。你再也不知道房子在哪里了,至少看不到那张名片。但是房子还在那里


删除指针就像拆毁房子一样。名片仍然会告诉你那所房子过去在哪里,但是如果你开车去那里(取消指针),你会看到房子不见了。或者更糟糕的是,他们可能同时在那个地址建立了一个核废料存储设施。

delete被称为delete,不仅是为了释放分配给该对象的内存,也是为了调用该对象的析构函数

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

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

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

指针应指向一个物体。所以这一系列的陈述毫无意义

pointer = nullptr; delete pointer;

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

但带有
删除指针;pointer=nullptr
当试图删除一个已经删除的指针时,它会不会崩溃?这有什么问题吗?你不明白。将指针设置为null并不是删除它。只是将其设置为指向null。在删除之前设置pointer=null,然后再删除可能会导致意外行为,具体取决于实现。将指针设置为null不会“删除”它。指针指向的内存仍被分配并标记为系统正在使用。你刚刚告诉你的代码忘记它在哪里,所以现在你泄漏了一些内存。你的应用程序不知道内存在那里,因为你忘了它,所以你不能“释放”它。而且内存系统不会为您释放它,因为它不知道您使用该内存的目的或用途。@Omega delete pointer;指针=nullptr。只删除指针。删除后将其设置为null是可以的。将null设置为指针与删除不同。要扩展此类比,可以执行
pointer=numptr只要你愿意,因为仍然有一张名片,但没有墨水可以去除,所以它没有不良影响(除了失去房子所在地的线索)。试图调用
delete指针在指针已经被删除之后是错误的,因为您现在正试图删除一个不再存在的房子。在
pointer=nullptr
之后尝试调用
delete pointer
也是不好的,因为您现在试图删除一栋房子,却不知道该去哪里看。@FaithForHumans
delete nullptr
被定义为无操作。
pointer = nullptr; delete pointer;