第13章 网络 Page735~736 “I/O对象”的链式传递 计数器继承enable_shared_from_this<DownCounter>

使用enable_shared_from_this基类和该基类带来的shared_from_this()方法。DownCounter被加上基类enable_shared_from_this<T>

代码如下:

47行代码先通过shared_from_this()方法安全正确地复制智能指针counter这很重要

47行代码要是用这样的代码来获取shared_this会怎么样?

auto shared_this = std::shared_ptr <DownCounter> (this);

 不可以,这样会造成47行的shared_this认为,自己是裸指针this的第一个守护者,引用计数重新变为1。也就是说,47行的shared_this和62行的counter不是相互引用的,62行的counter认为自己是this的唯一守护者,47行的shared_this也认为自己是this的唯一守护者。

那么出了60行的launch_rocket函数,由于counter是个栈变量,counter会释放掉this。同样47行的shared_this也会将this再释放掉一次,造成重复释放。

再通过lambda表达式以“捕获”的方式实现传递。

如果不想使用Lambda表达式呢?让我们想象:(1)函数对象?不行,之前就是使用函数对象,语法格式难以传递指针对象;(2)C风格的函数指针?不好,成员函数的函数指针难弄还丑。

没错,只剩下function类型了,这是下一篇博文的内容。

运行效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值