C++ 由多个对象指向的随时可能死亡的对象

C++ 由多个对象指向的随时可能死亡的对象,c++,C++,在我的游戏中,有很多类Foo的对象彼此交互。类Foo的静态方法更新所有对象,使用容器跟踪创建的对象 我的问题是,一个Foo对象可能会杀死另一个对象,Foo的其他实例不知道这个可怕的事件,他们可能会使用死对象(已删除),从而给出一个错误 我有一些避免指针指向已删除对象的想法,但我认为它们不合适 1) 一种检查空对象的智能指针 也许这是个更糟糕的主意,我在任何地方都没有看到这样的东西。我可以创建一个指针,当调用delete时,删除指向的Foo对象,然后在转换为Boolean时给出false(这样就可

在我的游戏中,有很多类Foo的对象彼此交互。类Foo的静态方法更新所有对象,使用容器跟踪创建的对象

我的问题是,一个Foo对象可能会杀死另一个对象,Foo的其他实例不知道这个可怕的事件,他们可能会使用死对象(已删除),从而给出一个错误

我有一些避免指针指向已删除对象的想法,但我认为它们不合适

1) 一种检查空对象的智能指针

也许这是个更糟糕的主意,我在任何地方都没有看到这样的东西。我可以创建一个指针,当调用delete时,删除指向的Foo对象,然后在转换为Boolean时给出false(这样就可以知道是否可以对其调用方法)

2) 每个Foo对象不使用指针跟踪其他对象,而是使用ID跟踪其他对象

然后该对象获得一个指向另一个Foo对象的指针,该对象具有Foo类的静态方法(正如我所说的,Foo类有一个跟踪所有实例的容器)。 它也可以在多线程环境中工作,只需进行简单的修改,但它可能非常扩展,每个对象在每个帧中搜索容器中的另一个对象

3) 每个Foo对象都跟踪有指向它的指针的对象。 该对象在被终止(删除)时调用其他对象的方法。然后,这些对象将删除指向已删除对象的任何指针。还有其他的课程。所以这不是真正的面向对象


实际上,我认为有一个我找不到的简单解决方案。

基本上所有这些对象都拥有这个可杀死对象的所有权。你能给他们的最有力的保证是它不会从他们下面被删除。您可以通过给每个人一个
boost::shared\u ptr
来实现这一点。当对象死亡时通知所有对象将允许它们删除引用。您可以使用
boost::signals
来实现这一点。我会先试试这个


如果你不能这样做,那么你可以让他们存储一个
boost::weak_ptr
,当他们调用
boost::weak_ptr::lock
失败时,他们就会知道它已经死了。

基本上所有这些对象都拥有这个可杀死对象的所有权。你能给他们的最有力的保证是它不会从他们下面被删除。您可以通过给每个人一个
boost::shared\u ptr
来实现这一点。当对象死亡时通知所有对象将允许它们删除引用。您可以使用
boost::signals
来实现这一点。我会先试试这个

如果你不能做到这一点,那么你可以让他们存储一个
boost::weak_ptr
,当他们调用
boost::weak_ptr::lock
失败时,他们就会知道它死了