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

Sea*_*ean 0 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() { }
};
Run Code Online (Sandbox Code Playgroud)

它的用法类似于:

std::shared_ptr<A> pt = A::create();
pt->f();
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 6

std::enable_shared_from_this<A>必须是一个公共基地。当shared_ptr构造函数看到您从派生时enable_shared_from_this,它将自身的一个弱副本存储在enable_shared_from_this对象中。如果继承不是公共的,则不会发生这种情况,并且weak_ptr里面存储的内容enable_shared_from_this将为null,从而bad_weak_ptrshared_from_this以后尝试从中构造a 时导致异常shared_ptr