删除指针和将其设置为 nullptr 之间有什么区别?

What's the difference between delete-ing a pointer and setting it to nullptr?

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

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

正在做

delete pointer;
pointer = NULL;

很好,但是

pointer = NULL;
delete pointer;

不是,因为您已经将指针设置为 NULL,所以 delete 命令将没有要删除的内容(或者它认为如此)。你现在有一个内存泄漏,因为无论指针指向什么(比方说一个链表)现在都漂浮在你的内存中的某个地方并且程序无法跟踪。

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

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

Is saying delete pointer and pointer = nullptr the same? Probably not, but does the latter free up memory?

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

What about delete pointer; pointer = nullptr / pointer = nullptr; delete pointer?

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

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

Why not use that to make a safe way to delete pointers prematurely if required, where they would normally be deleted some other time and cause an error with a normal delete?

不太清楚你的意思...

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

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

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

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

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

但一般自定义类型的对象在删除时需要调用其析构函数

指针应该指向一个对象。所以这个语句序列没有意义

pointer = nullptr; delete pointer;

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