以下代码在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
之前没有完全执行的事实有关,因此对象没有完全构造?
如果没有,那是什么?
答案 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
。