使用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类型了,这是下一篇博文的内容。