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

std::bad_weak_ptr exception in shared_from_this after object construction

本文关键字:shared from this 异常 对象 bad weak ptr std      更新时间:2023-10-16

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

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_ptrpt后调用了对 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对象中存储自身的弱副本。如果继承不是公共的,则不会发生这种情况,并且存储在enable_shared_from_this中的weak_ptr将为 null,从而导致bad_weak_ptr异常,shared_from_this稍后尝试从中构造shared_ptr

此处需要公共继承。因为它是A类,所以它不是默认的。看到异常/bad_weak_ptr的原因也是如此。