问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么不能在构造函数中调用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();
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
"你是在哪看到我的照片?"怎么说英语 留恋地看着我的照片用英语怎么说? 高德iphone地图下载 苹果手机高德地图怎么下载地图 孕中期适合出游吗 哪些孕妇不适合长途旅行 孕妇坐长途车旅行的好处 孕妇出游的最佳时间 孕晚期适合出游吗 孕妇外出旅行禁忌 小米11烧wifi啥表现 速求答案:第一次做梦梦到很多鸡屎 是什么预兆啊 而且鸡屎在家的裙子边里... 五六平方的小门面做什么生意在居民区 关于春节的对联! 安徽泾县的宣纸被誉为纸中之王,安徽宣纸有什么特别之处? 螳螂哪里抓 在镜框上边缘叠加一层的镜框是什么类型 兰州什么地方最穷 目前国家规定回民补助是多少? 少数民族补助新的政策规定咨询? 少数民族补贴 禁食猪肉民族 补贴 求问相关细则 云南省回族补贴发放依据 少数民族乡镇公务员有补贴吗 现在还有回民补贴吗准是多少呀 少数民族4年退伍兵补贴多少 是所有单位都有回族补贴吗? 南京回民补贴多少钱一个月 在手机上面如何查自己手机的服务密码 怎么查看自己的手机服务密码 高分求解!!办公软件,提示&#39;无法启动服务 原因可能是已被禁用或与其他相关联的设备没有启动&#39;怎么办 用OD运行一个带有VMP壳子的软件显示a debugger has been found running C++11 using是用疑问 win8.1免激活专业版怎么安装 老是梦见去前夫家里面去是怎么回事 威海智慧云平台学生登录用户名是什么 电信人工电话设置转移会转移到哪里 奋斗激发人心励志早安正能量句子 marc+jacobs手表怎么调时间 she&#39;s 如皋专柜 里面的包是什么牌子的 元宵节搞笑的短信 元宵节搞笑短信谁知道好的/??? 海南外地地高级工程师资格如何认证 泥螺罐头怎么做 公司合同到期换了一个公司和我签 练太极剑是选硬剑好还是软剑好? 单反相机的300—800mm这个焦段的镜头,整个镜头有多少厘米,能手持吗? 定焦镜头800mm焦距转换成DC相机相应焦距倍数是如何转换的 佳能600l和800l镜头哪个好 岩板与瓷砖对比还有什么优越性能? 三菱plc中的top指令在台达plc之中怎么运用?可以用其他指令代替吗? 家实电饭锅1.3l哪里有售