为什么不能在构造函数中调用shared
发布网友
发布时间:2022-06-18 02:09
我来回答
共1个回答
热心网友
时间:2023-11-24 02:29
示例代码:
[cpp] view plain copy print?
class Chicken : public enable_shared_from_this<Chicken>
{
public:
Chicken()
{
shared_ptr<Chicken> chicken_ptr = shared_from_this(); //throw std::bad_weak_ptr
}
};
再看shared_from_this()的行为:
[cpp] view plain copy print?
return _weak_ptr->lock();
_weak_ptr 为父类( enable_shared_from_this <Chicken>)的成员变量,需要一个shared_ptr <Chicken>对象来初始化它,而shared_ptr <Chicken>需要一个Chicken对象来创建,但此时Chicken对象正在构造中,这是个鸡与蛋的无解问题。
其实 _weak_ptr 成员变量是在 shared_ptr 的构造函数中延迟初始化的,不只是在构造函数中不能调用shared_from_this ,像下面的使用方式同样不行:
[cpp] view plain copy print?
Chicken* chicken = new Chicken();
shared_ptr<Chicken> chicken_ptr = chicken->shared_from_this(); //throw std::bad_weak_ptr
enable_shared_from_this 不是从this祼指针变出智能指针的魔法,它只是一个辅助类,为一个只使用shared_ptr 管理对象生命周期的类添加一个自身的智能指针成员变量供内部使用。
而“不能在构造函数中调用 shared_from_this ”这个问题仅仅是标准实现上的一个漏洞。
你应该像下面这样用:
[cpp] view plain copy print?
class Chicken : public enable_shared_from_this<Chicken>
{
public:
Chicken()
{
}
void use()
{
shared_ptr<Chicken> chicken_ptr = shared_from_this();
}
};
shared_ptr<Chicken> chicken_ptr(new Chicken);
chicken_ptr->use();