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()而不是在教师未在此处包括的某些代码中引发了异常。
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_ptr在shared_from_this以后尝试从中构造a 时导致异常shared_ptr。