std::bad_weak_ptr 使用 shared_from_this 时出现异常

std::bad_weak_ptr exception when using shared_from_this

以下代码在 MyCommand 的构造函数执行但不执行函数 MyCommand::execute.

时导致 std::bad_weak_ptr 异常
class Observer
{
public:
    Observer(){}
    virtual ~Observer(){}

    virtual void update(const std::string& msg) = 0;
};

class Command
{
public:
    Command(){}
    virtual ~Command(){}

    virtual void execute() = 0;
};

class MyCommand : public Command, public Observer, public std::enable_shared_from_this<MyCommand>
{
public:
    MyCommand()
    {
        // std::bad_weak_ptr exception
        std::shared_ptr<Observer> observer = shared_from_this();
    }

    virtual ~MyCommand(){}

private:
    virtual void execute()
    {
        // no exception
        std::shared_ptr<Observer> observer = shared_from_this();
    }
    virtual void update(const std::string& msg){}
};

int main(int argc, const char* argv[])
{
    // causes std::bad_weak_ptr exception
    std::shared_ptr<Command> myCommand = std::make_shared<MyCommand>();

    // doesn't cause std::bad_weak_ptr exception
    myCommand->execute();
}

阅读 enable_shared_from_this,我知道:

Prior to calling shared_from_this on an object t, there must be a std::shared_ptr that owns t.

我需要理解为什么异常在 ctor 中抛出但在 execute 函数中没有。

是否与调用shared_from_this之前ctor尚未完全执行,因此对象未完全构造有关?

如果不是,那是什么?

您不能在构造函数中使用 shared_from_this,因为尚未分配 shared_ptr。看到这个

然而,当对象被构建并且有任何 shared_ptr 与实例相关联时,您可以像往常一样调用 shared_from_this

注意:对我来说,问题是我没有添加 "public" 关键字(希望这会节省其他人一些时间)。

例如:

class A : std::enable_shared_from_this<A> { //BAD
class A : public std::enable_shared_from_this<A> { //GOOD