我有一个结构 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_this
,A
已停止。
关于c++ - 在 shared_ptr 过期后定位 weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51622346/