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,很好。它确实在重新审视这个例子时这样说。