C++ std::对象构造后,共享\u中的\u中存在错误\u弱\u ptr异常
我定义了一个类似于以下内容的类:C++ std::对象构造后,共享\u中的\u中存在错误\u弱\u ptr异常,c++,inheritance,shared-ptr,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() { } }; class A:std:
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() { }
};
class A:std::从\u启用\u共享\u{
公众:
静态std::shared_ptr create(){
返回std::shared_ptr(新的A());
}
void f(){
从_this()共享_;
}
私人:
A(){}
};
它的用法类似于:
std::shared_ptr<A> pt = A::create();
pt->f();
std::shared_ptr pt=A::create();
pt->f();
尽管在创建共享的\u ptr
pt
之后调用了来自\u this()的对共享的\u的调用,但是对f()
的调用仍然会引发错误的\u弱的\u ptr
异常。在gdb
中运行它可以确认异常是在调用f()
时抛出的,而不是在讲师调用的一些我没有包含在这里的代码中。std::enable_shared_from_此
必须是公共基础。当shared\u ptr
构造函数看到您从enable\u shared\u from\u this
派生时,它会在enable\u shared\u from\u this
对象中存储自身的弱副本。如果继承不是公共的,则不会发生这种情况,并且存储在enable\u shared\u from\u this
中的weak\u ptr
将为空,从而导致bad\u weak\u ptr
异常,当shared\u from\u this
稍后尝试从中构造共享的\u ptr
时,这里需要公共继承。由于它是A类,因此它不是默认值。看到异常/坏\u弱\u ptr的原因也是如此。这个例子倾向于表明OP执行的继承是正确的。这看起来像是try-catch语句中的问题。@RobertPrévost-该示例中的继承是公共的Good
是一个struct
@PeteBecker,很好。它确实在重新审视这个例子时这样说。