gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:58:10 25 4
gpt4 key购买 nike

我有一个结构 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com