后
delete ptr;
Run Code Online (Sandbox Code Playgroud)
指针对象ptr 可能仍然保持与之前相同的值.它现在指向一个不存在的对象,因此尝试取消引用它,甚至引用它的值,都有未定义的行为.如果你不小心做了类似的事情:
delete ptr;
// ...
*ptr = 42;
Run Code Online (Sandbox Code Playgroud)
它可能会悄悄地破坏您不再拥有的内存,或者可能已经重新分配给其他对象的内存.
将指针设置为null:
delete ptr;
ptr = NULL; // or 0 or nullptr
Run Code Online (Sandbox Code Playgroud)
意味着意外尝试取消引用指针更有可能导致程序崩溃.(在这种情况下,崩溃是一件好事.)
窃取凯西的评论:
C++11§3.7.4.2解除分配函数[basic.stc.dynamic.deallocation]第4段:
如果给标准库中的释放函数赋予的参数是一个不是空指针值的指针(4.10),则释放函数将释放指针引用的存储,使所有指向解除分配存储的任何部分的指针无效. .使用无效指针值(包括将其传递给释放函数)的效果未定义.
如果指针对象处于其生命周期的最后,您不必费心,因为不可能意外地使用它:
{
int *ptr = new int(42);
// ...
delete ptr;
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,无论如何,你最好还是使用像智能指针这样的更高级别的构造.