7

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

4

5 回答 5

16

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

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

于 2015-07-24T20:17:43.100 回答
9

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

正在做

delete pointer;
pointer = NULL;

很好,但是

pointer = NULL;
delete pointer;

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

于 2015-07-24T20:12:05.157 回答
3

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

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

怎么样delete pointer; pointer = nullptr/pointer = nullptr; delete pointer?

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

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

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

不明白你的意思...

于 2015-07-24T20:15:46.397 回答
2

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

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

于 2015-07-24T20:14:58.210 回答
0

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

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

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

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

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

pointer = nullptr; delete pointer;

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

于 2015-07-24T20:21:50.633 回答