shared_ptr,subscription,析构函数

时间:2009-12-18 20:04:57

标签: c++ shared-ptr observer-pattern subscription weak-ptr

我在整个应用程序中使用Boost / shared_ptr指针。当释放对象的最后一个引用时,shared_ptr将为我删除该对象。应用程序中的对象订阅应用程序中心位置的事件,类似于观察者/订阅者模式。

在对象析构函数中,对象将从订阅列表中取消订阅。订阅列表基本上只是list<weak_ptr<MyObject> >。我想做的是类似的事情:

Type::~Type()
{
  Subscriptions::Instance()->Remove(shared_from_this());
}

我的问题是,在析构函数中无法调用shared_from_this,因此上面的代码会引发异常。

在我的旧实现中,订阅列表只是一个指针列表,然后它工作。但是我想使用weak_ptr引用来降低我通过手动内存管理搞砸内存的风险。

由于我依赖shared_ptr来删除对象,因此我的代码中没有一个地方可以逻辑地调用Unsubscribe。

关于在这种情况下该怎么做的任何想法?

2 个答案:

答案 0 :(得分:1)

  1. 您可以通过Subscription实例销毁对象,然后它会自动删除指针。
  2. 您可以忘记将它们从订阅中删除 - 无论如何都不能锁定weak_ptr,然后您可以删除它们。
  3. 您可以为每个对象分配唯一ID,然后通过唯一ID而不是shared_ptr
  4. 删除
  5. 您可以将正常指针传递给Remove而不是共享指针 - 它将作为“ID”。

答案 1 :(得分:0)

  

我的问题是shared_from_this无法被调用   析构函数,因此上面的代码将引发异常。

根据定义,它将在析构函数中抛出异常,因为它已过期

那你到底想要什么?一个“过期”的共享指针?只需创建一个空的共享指针即可。

还是过期的弱指针?

也许您注意到“问题”不是shared_from_this抛出(这是一种症状),但是所有所有者此时已经已经被重置或破坏,并且弱指针正在已过期,并且等效于一个空的默认创建的弱指针(*),因此您只应传递一个默认的初始化弱指针。

Subscriptions::Instance()->Remove(weak_OR_owning_pointer)也没有任何意义(使用弱指针或拥有指针),因为您无法将弱指针与任何事物进行比较,您只能尝试将其锁定(然后进行比较)。 / p>

因此您可以删除过期的弱指针。 Remove的论点没有用。

(*)或是您有一个非常严重的双重错误,即双重破坏了被毁物体!