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
以下代码在 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