使用shared_from_this时std :: bad_weak_ptr异常

时间:2017-07-20 09:31:08

标签: c++ c++11 constructor shared-ptr

以下代码在std::bad_weak_ptr的ctor执行时导致MyCommand异常但不执行MyCommand::execute函数。

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,我知道:

  

在对象t上调用shared_from_this之前,必须这样做   是一个拥有t的std :: shared_ptr。

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

是否与ctor在调用shared_from_this之前没有完全执行的事实有关,因此对象没有完全构造?

如果没有,那是什么?

2 个答案:

答案 0 :(得分:4)

注意:对我来说,问题是我没有添加“ public”关键字(希望这可以节省其他时间)。

例如:

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

答案 1 :(得分:3)

您无法在构造函数中使用shared_from_this,因为尚未分配shared_ptr。见Why shared_from_this can't be used in constructor from technical standpoint?

但是,当构造对象并且与实例关联的任何shared_ptr时,您可以像往常一样调用shared_from_this