【发布时间】:2009-12-18 20:04:56
【问题描述】:
我在整个应用程序中使用 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。
关于在这种情况下该怎么做有什么想法吗?
【问题讨论】:
-
您遇到了依赖共享指针的问题之一——它们不能替代设计。
-
它旨在提供帮助。当回答者对问题没有真正了解时,此处显示“使用共享指针”的答案数量。是可怕的。恕我直言,应该始终质疑使用共享指针。如果您这样做了,您可能已经注意到了之前的取消订阅问题。
-
尼尔,可能更有帮助的是指出设计缺陷可能在哪里,并给出如何修复的想法。我试图在下面的 cmets 中做到这一点。不过,你是对的。默认垃圾收集/依赖析构函数语义可能是设计缺陷的危险信号。
-
尼尔发表了评论。当然,深入细节会更有帮助,但他不妨将其发布为答案。
标签: c++ shared-ptr observer-pattern subscription weak-ptr