删除后,将C++指针初始化为ZERO?

Vij*_*jay 2 c++ pointers memory-management

在C++中,我们使用deleteoperator来在大多数时间删除对象.

delete不会使指针值NULL.有什么方法可以自动实现吗?

例如

int *p = new int;
delete p;  // this should deallocate object pointed by p
           // and also initialized value of p = NULL
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 14

你的建议有两个问题.

虚假的安全感

你的建议会导致虚假的安全感.当然,标准保证如果你调用delete空指针,它不会爆炸.但是,您忘记了一个小事实:没有一个指向您对象的指针.

int* p = new int(8);
int* q = p;
delete p; p = 0;
delete q; // Undefined Behavior
Run Code Online (Sandbox Code Playgroud)

因此,这种做法毫无用处.而且由于虚假的安全感比没有安全感差,我实际上强烈反对它.希望人们在应用deletenilly-willy 之前会思考.

这将我们带到第二个问题

你不敢使用吗? delete

delete应保留给智能指针或其他容器的实现者.以下适用:

  • 仅供专家使用
  • (专家)不要*

*对于您正在尝试实现的目标,可能已经存在已调试的实现.

大量现有工具来管理内存:

  • 无处不在的各种各样的智能指针:std::unique_ptr或者std::auto_ptr(取决于你的C++版本)std::scoped_ptr,std::shared_ptr(和它的comparse std::weak_ptr,或者它们的boost/tr1等价物)
  • 容器的无处不在的各种口味:boost::array,boost::scoped_array,std::vector(和共)
  • 和鲜为人知,但在OO中如此有用:( boost::ptr_vector和co)
  • 有甚boost::intrusive_ptr至和Boost Intrusive Containers库或Boost MultiIndex库(带有BiMap衍生物)
  • 可能还有其他几个boost库,可能更专业,比如Boost.Signals

有了这样一个异类的野生动物,很难想象你突然发现了一种新的方式来使用与我们所做的完全不同的数据.如果您有,请随时发布,我们将帮助您了解如何使用这些工具来适应您的情况(或指导您如何创建新形式的智能指针).


Bo *_*son 5

无论如何,这并没有多大帮助,因为指向被删除对象的指针可能不止一个。

int* p = new int;

int* q = p;

delete p;   // how do we NULL q?
Run Code Online (Sandbox Code Playgroud)

最好的想法是在p超出范围之前使用delete。或使用标准容器,因此我们根本不需要新的/删除的容器。