指针安全对象?

时间:2010-04-27 12:51:29

标签: c++ pointers

在具有指向它的指针列表的对象中有一个向量是否明智?

这样当删除对象时,它可以删除指向它的所有指针以防止空指针异常吗?

4 个答案:

答案 0 :(得分:3)

不,绝对不是。你只能删除一次指针;释放已被删除的内容(“双重释放”)未定义

A* foo = new A();
A* bar = foo;
delete foo;
delete foo; // <-- BAD
delete bar; // <-- EQUALLY BAD

听起来你正在寻找像auto_ptr这样的东西;你可能想调查一下。如果您想要将所有指向零的指针归零,那么就无法做到这一点

答案 1 :(得分:1)

如果您的最终目标是检测何时从对象的用户中释放对象,则最好的选择是使用弱指针语义。 Boost智能指针库中有一个实现(参见weak_ptr)。它通过反转您描述的参考图解决了您描述的问题。它有指针引用一个公共计数器实例,当发起者删除它设置为零的对象时。因此,因为所有weak_ptr引用都指向单个计数器,所以它们都会立即看到更改,因此您可以判断对象何时消失。

答案 2 :(得分:0)

我真的不明白你想要达到的目标,但删除相同指针的x倍也不会让你走得太远......

如果你想避免在delete hapenned之后出现错误的指针,你应该看看智能指针,特别是boost::shared_ptr

  

指向的对象是保证的   最后一个shared_ptr时删除   指向它被摧毁或重置。

使用它,您不再需要手动delete指针,shared_ptr自行完成。

作为使用指针的一般帮助,您可能需要查看其他boosts smart pointersstd::auto_ptr

答案 3 :(得分:0)

从技术上讲,你要解决的问题是“悬空指针”。看看auto_ptr并搜索“智能指针”...至少我想你的意图是将指向你对象的所有指针归零。

使用对象的每个函数也提供存储位置的地址是非常困难或至少是奇怪的。很难将这些对象和指针复制到您的控件之外(使用memcpy更容易)

像valgrind这样的工具也可以帮助你