在删除指针后将空指针指向NULL是否是一种好的做法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

虽然使用智能指针,就不用考虑这个了。

下面的代码有什么问题吗?

Foo * p = new Foo;
// (use p)
delete p;
p = NULL;

提问于
用户回答回答于

将指针设置为0可以避免双重删除时的崩溃。

考虑以下:

Foo* foo = 0; // Sets the pointer to 0 (C++ NULL)
delete foo; // Won't do anything

或者

Foo* foo = new Foo();
delete foo; // Deletes the object
delete foo; // Undefined behavior 

用户回答回答于

在删除所指向的内容后,将指针设置为NULL肯定不会出问题,但它通常是对一个更基本问题的一种fix:为什么首先使用指针?

有两个典型的原因:

  • 只是想在堆上分配一些东西。在这种情况下,将其包装在RAII对象中将会更加安全和清洁。当不再需要该对象时,结束RAII对象的范围。这是std::vector工作的原理,它解决了无意中将指针释放到释放内存的问题。。
  • 或者你想要一些复杂的共享所有权语义。返回的指针new可能与delete被调用的指针不同。同时,多个对象可能同时使用了该对象。在这种情况下,共享指针或类似的东西会更好。

扫码关注云+社区