我有一个类似于以下内容的类:
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()
的调用引发了异常,而不是在教师未调用的某些代码中抛出该异常。
答案 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的原因。