c++ - 在 shared_ptr 过期后定位 weak_ptr

标签 c++ shared-ptr smart-pointers weak-ptr

我有一个结构 A,它的对象由 shared_ptr 管理。结构 A 持有对结构 B 的引用。 B 对象需要跟踪哪些 A 对象持有对它们的引用,还需要能够将 shared_ptr 返回给这些对象。为简化此操作,我将一组 weak_ptr 存储到 B 内的关联 A 对象。到目前为止,还不错。

我的问题是我希望 A 的析构函数从其关联的 B 对象中删除对自身的引用。然而,(我认为是)显而易见的解决方案不起作用,因为在调用 A 的析构函数时,其关联的 weak_ptr 已过期,使其成为很难从集合中删除。这是我尝试过的:

#include <memory>
#include <set>

struct A;
struct B;

struct B{
   std::set<std::weak_ptr<A>, std::owner_less<std::weak_ptr<A>>> set_of_a;
};

struct A : std::enable_shared_from_this<A>{
   B &b;
   A(B &b):b(b){};
   ~A(){
      // bad_weak_ptr exception here
      b.set_of_a.erase(shared_from_this());
   }
};


int main(){
   B b;
   std::shared_ptr<A> a1 = std::make_shared<A>(b);
   b.set_of_a.insert(a1);
   {
      std::shared_ptr<A> a2 = std::make_shared<A>(b);
      b.set_of_a.insert(a2);
   }
   return 0;
}

完成此任务的正确方法是什么?我可以让 A 的析构函数通过 B 的集合运行并删除任何过期的 weak_ptr,但这看起来并不干净。我也可以将 B 的集合转换为原始 A 指针,并在需要时使用这些原始指针访问 A 的 shared_from_this(),但是我忍不住想我只是做错了什么。

最佳答案

不要急于从 B::set_of_a 中删除元素。当您锁定 weak_ptr 以访问对象时,检查它是否为空,然后删除。

~A 开始后,您不能 shared_from_thisA 已停止。

关于c++ - 在 shared_ptr 过期后定位 weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51622346/

相关文章:

c++ - 在 QML 中显示 FPS

c++ - 编码接受来自未指定来源的随机位的密码算法

c++ - 创建以共享指针为参数的对象的共享指针

c++ - 使用唯一的指针调用函数会使我的程序崩溃

c++ - 智能指针 : cast between base and derived classes

c++ - 如何在 C++ 中使用 ascii 值处理大于 9 的值

c++ - 从 C++11 中的函数调用返回 std::vector 的正确方法( move 语义)

c++ - 无阻塞更新缓存

c++ - 重置std::shared_ptr是否会导致重置其删除程序?

c++ - unique_ptr 编译错误