std::bad_weak_ptr 对象构造后 shared_from_this 中的异常
std::bad_weak_ptr exception in shared_from_this after object construction
我有一个 class 定义类似于以下内容:
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()
的调用中抛出的,而不是在我未包含在此处的一些由讲师调用的代码中抛出的。
std::enable_shared_from_this<A>
必须是 public 基础。当 shared_ptr
构造函数发现您从 enable_shared_from_this
派生时,它会在 enable_shared_from_this
对象中存储自身的弱副本。如果继承不是public,则不会出现这种情况,enable_shared_from_this
中存储的weak_ptr
将为null,导致shared_from_this
之后出现bad_weak_ptr
异常尝试从中构造一个 shared_ptr
。
Public 这里需要继承。因为它是 class A ,所以它不是默认值。看到异常的原因也是如此/ bad_weak_ptr.
我有一个 class 定义类似于以下内容:
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()
的调用中抛出的,而不是在我未包含在此处的一些由讲师调用的代码中抛出的。
std::enable_shared_from_this<A>
必须是 public 基础。当 shared_ptr
构造函数发现您从 enable_shared_from_this
派生时,它会在 enable_shared_from_this
对象中存储自身的弱副本。如果继承不是public,则不会出现这种情况,enable_shared_from_this
中存储的weak_ptr
将为null,导致shared_from_this
之后出现bad_weak_ptr
异常尝试从中构造一个 shared_ptr
。
Public 这里需要继承。因为它是 class A ,所以它不是默认值。看到异常的原因也是如此/ bad_weak_ptr.