【发布时间】:2010-04-27 12:51:29
【问题描述】:
在一个对象中有一个向量和一个指向它的指针列表会很聪明吗?
这样当对象被删除时,它可以删除所有指向它的指针以防止空指针异常?
【问题讨论】:
-
"它可以删除所有指向它的指针" 你的意思是所有指向它的对象。这些问题的答案不可避免地取决于你在做什么,但可能不是。
在一个对象中有一个向量和一个指向它的指针列表会很聪明吗?
这样当对象被删除时,它可以删除所有指向它的指针以防止空指针异常?
【问题讨论】:
不,绝对不是。您只能删除一次指向某事物的指针;释放已经被删除的东西(“双重释放”)是未定义的
A* foo = new A();
A* bar = foo;
delete foo;
delete foo; // <-- BAD
delete bar; // <-- EQUALLY BAD
听起来您正在寻找类似auto_ptr 的东西;你可能想调查一下。如果您希望在对象被销毁时将所有指向您的对象的指针归零,则无法做到这一点
【讨论】:
如果您的最终目标是检测对象何时从该对象的用户中释放出来,那么最好的选择是使用弱指针语义。 Boost Smart Pointer 库中有一个实现(参见weak_ptr)。它通过反转您描述的参考图来解决您描述的问题。它的指针引用单个公共计数器实例,当发起者删除它设置为零的对象时。因此,因为所有weak_ptr 引用都指向单个计数器,所以它们都会立即看到更改,因此您可以知道对象何时消失。
【讨论】:
我不太明白你想要达到什么目的,但是删除 x 次相同的指针不会让你走得太远......
如果您想避免在delete 发生后出现错误指针,您应该查看智能指针,尤其是boost::shared_ptr。
指向的对象保证 当最后一个 shared_ptr 被删除 指向它的对象被销毁或重置。
使用它,您不再需要手动delete 指针,shared_ptr 会自行完成。
作为使用指针的一般帮助,您可能需要查看其他 boosts smart pointers 或 std::auto_ptr
【讨论】:
从技术上讲,您要解决的问题是“悬空指针”。看看 auto_ptr 并搜索“智能指针”......至少我想你的意图是将所有指向你的对象的指针归零。
很难或至少很奇怪,每个使用对象的函数还提供存储位置的地址。很难将这些对象和指针复制到您的控制之外(使用 memcpy 更容易)
像 valgrind 这样的一些工具也可以帮助你
【讨论】: