是说delete pointer
和pointer = nullptr
一样吗?可能不会,但后者会释放内存吗?delete pointer; pointer = nullptr
/呢pointer = nullptr; delete pointer
?如果需要,为什么不使用它来提供一种安全的方法来提前删除指针,因为它们通常会在其他时间被删除并导致正常删除时出错?
5 回答
pointer = nullptr;
就像去除名片上的墨水一样。您不再知道房子的位置,至少不是通过查看那张特定的名片。但是房子还在。
delete pointer;
就像拆房子一样。名片仍然告诉你那所房子曾经在哪里,但如果你开车去那里(取消引用指针),你会看到房子已经不见了。或者更糟糕的是,也许他们同时在那个地址建立了一个核废料储存设施。
这是不一样的,因为虽然您可能将指针设置为 null,但指针指向的内容仍会占用空间。
正在做
delete pointer;
pointer = NULL;
很好,但是
pointer = NULL;
delete pointer;
不是,因为您已经将指针设置为 NULL,所以该delete
命令将不会删除任何内容(或者它认为)。你现在有内存泄漏,因为无论指针事先指向什么(比如说一个链表)现在都浮动在你的内存中的某个地方并且程序无法跟踪。
是说
delete pointer
和pointer = nullptr
一样吗?可能不会,但后者会释放内存吗?
delete
表达式调用析构函数并释放内存(即,将其返回到空闲存储区)。将指针设置为空指针不会执行这些操作,并且如果没有其他指向该对象的指针,则可能会泄漏内存或资源。
怎么样
delete pointer; pointer = nullptr
/pointer = nullptr; delete pointer?
如果删除已经为空的指针,则没有效果。所以前者销毁对象并释放内存,然后将指针设置为null,而后者仍然泄漏,因为删除没有效果。
有些人建议在删除后设置一个指向 null 的指针,这样如果由于 bug 再次删除它,就不会导致程序崩溃。我个人不推荐这个;我认为删除一个指针两次是一个错误,即使它第二次没有效果,如果程序崩溃,那么你可以找到并修复那个错误,这很好。
如果需要,为什么不使用它来提供一种安全的方法来提前删除指针,因为它们通常会在其他时间被删除并导致正常删除时出错?
不明白你的意思...
删除指针会释放指针指向的内存。仅将指针设置为nullptr
将导致内存泄漏,因为现在无法删除指针指向的内存。
您可以在它nullptr
之后设置一个指针,delete
因为它告诉您该指针现在不指向任何内容,如果您delete
再次意外调用它,它是一个非操作,您的程序将继续运行。
调用 delete 不仅可以释放为对象分配的内存,还可以调用对象的析构函数。
如果不调用析构函数,则对象仍将保留资源。
当然,基本类型没有析构函数,调用 delete 只会释放基本类型对象占用的内存。
但一般来说,用户定义类型的对象需要在删除时调用它们的析构函数。
并且指针应指向一个对象。所以这一系列的陈述没有意义
pointer = nullptr; delete pointer;
因为nullptr
不是对象的有效地址。它是一个 NULL 指针文字。