构造对象后shared_from_this中的std :: bad_weak_ptr异常

时间:2018-09-06 00:08:22

标签: c++ inheritance shared-ptr

我有一个类似于以下内容的类:

class A : std::enable_shared_from_this<A> {
public: 
  static std::shared_ptr<A> create() {
    return std::shared_ptr<A>(new A());
  }

  void f() { 
    shared_from_this();
  }

private:
  A() { }
};

,它的用法类似于:

std::shared_ptr<A> pt = A::create();
pt->f();

尽管在shared_ptr pt创建之后调用了shared_from_this(),但对f()的调用仍然导致抛出bad_weak_ptr异常。在gdb中运行它可确认对f()的调用引发了异常,而不是在教师未调用的某些代码中抛出该异常。

2 个答案:

答案 0 :(得分:5)

std::enable_shared_from_this<A>必须是 public 的基础。当shared_ptr构造函数看到您是从enable_shared_from_this派生的时,它将自己的弱副本存储在enable_shared_from_this对象中。如果继承不是公开的,则不会发生,并且存储在weak_ptr中的enable_shared_from_this将为null,从而导致bad_weak_ptr异常,而之后shared_from_this尝试构造一个shared_ptr

答案 1 :(得分:1)

此处需要公共继承。由于它是A类,因此不是默认值。这就是看到异常/ bad_weak_ptr的原因。