c++ - shared_ptr、订阅、析构函数

标签 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 来执行对象删除,因此我的代码中没有一个地方可以逻辑上调用取消订阅。

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

最佳答案

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

关于c++ - shared_ptr、订阅、析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930399/

相关文章:

Java:方法签名中类型的子类

android - 两个 fragment 之间通过 Activity 进行的通信是否可以称为 android 中的观察者模式?

c++ - 如何在不使用 to_string 或 stoi 的情况下将 int 转换为 C++11 中的字符串?

c++ - 如何修复 Visual Studio 2015 中的错误 MSVCP120D.dll?

c++ - 纯虚函数实现

c++ - 在msys下构建boost,找不到mingw.jam

c++ - 从共享指针的取消引用值中获取共享指针

c++ - 错误 2664 - 无法从 std::vector<...> 转换为 std::tr1::shared_ptr

c++ - 使用智能指针管理缓冲区

java - 事件观察者的替代方案