我有类似于以下内容:
class A {
std::weak_ptr<B> r;
A (std::weak_ptr<B> x) : r(x) {}
~A() {
r.lock();
}
};
class B : std::enable_shared_from_this<B> {
std::shared_ptr<A> r;
foo() {
r = std::make_shared<A>(shared_from_this());
}
};
在破坏B期间,调用~A();但是它想要回到被破坏的对象。 忽略围绕此问题的设计问题,是定义的行为,还是依赖编译器?
答案 0 :(得分:3)
表达式r.lock()将失败(即返回一个空的shared_ptr)。
weak_ptr有效,但shared_ptr已经在破坏B。
事件的顺序是:
shared_ptr<B>::~shared_ptr()
<strong reference count reduced to 0, destruction process begins>
<shared_ptr<B> is now empty>
~B()
shared_ptr<A>::~shared_ptr()
~A()
weak_ptr<B>::lock -> returns shared_ptr<B>(nullptr)
这里有一种次优设计的强烈气味。正式写出要求可能是个好主意。