指针和"NULL"

mel*_*bah 0 c++ null

我只是想知道将指针初始化为NULL或者在指针删除后将其设置为NULL是否有任何好处.

我在几个论坛上看到删除后设置为NULL是不必要的,有些编译器甚至不考虑该行.如果它什么都没改变,为什么有些人会使用它呢?

Kei*_*son 7

后

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)

正如其他人所说,无论如何,你最好还是使用像智能指针这样的更高级别的构造.

  • 在这种情况下,"崩溃是一件好事." (4认同)
  • @WhozCraig C++11§3.7.4.2释放函数[basic.stc.dynamic.deallocation]第4段:"如果给标准库中的释放函数赋予的参数是一个不是空指针值的指针(4.10) ,deallocation函数应该解除分配指针引用的存储空间,使所有指针解除引用解除分配存储的任何部分无效.使用无效指针值(包括将其传递给解除分配函数)的效果是未定义的. (2认同)