在对象X的破坏期间,对象X的weak_ptr仍然有效

时间:2017-09-08 09:46:35

标签: c++ language-lawyer

我有类似于以下内容:

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();但是它想要回到被破坏的对象。 忽略围绕此问题的设计问题,是定义的行为,还是依赖编译器?

1 个答案:

答案 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)

这里有一种次优设计的强烈气味。正式写出要求可能是个好主意。