我在整个应用程序中使用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。
关于在这种情况下该怎么做的任何想法?
答案 0 :(得分:1)
答案 1 :(得分:0)
我的问题是
shared_from_this
无法被调用 析构函数,因此上面的代码将引发异常。
根据定义,它将在析构函数中抛出异常,因为它已过期。
那你到底想要什么?一个“过期”的共享指针?只需创建一个空的共享指针即可。
还是过期的弱指针?
也许您注意到“问题”不是shared_from_this
抛出(这是一种症状),但是所有所有者此时已经已经被重置或破坏,并且弱指针正在已过期,并且等效于一个空的默认创建的弱指针(*),因此您只应传递一个默认的初始化弱指针。
Subscriptions::Instance()->Remove(weak_OR_owning_pointer)
也没有任何意义(使用弱指针或拥有指针),因为您无法将弱指针与任何事物进行比较,您只能尝试将其锁定(然后进行比较)。 / p>
因此您可以删除过期的弱指针。 Remove
的论点没有用。
(*)或是您有一个非常严重的双重错误,即双重破坏了被毁物体!