莱州做网站,汕头建设银行电话,外贸网站建设服务商,高端网页设计培训学校上一篇博文中#xff0c;我们使用单独的火箭发射函数#xff0c;结果什么结果也没有得到#xff0c;原因是launch_rocket()函数结束时#xff0c;其内的局部对象counter生命周期也结束了
那么可以将counter改为指针吗#xff1f;在堆中分配#xff0c;这样当函数退出时我们使用单独的火箭发射函数结果什么结果也没有得到原因是launch_rocket()函数结束时其内的局部对象counter生命周期也结束了
那么可以将counter改为指针吗在堆中分配这样当函数退出时它不会被释放。这样肯定是不行的这样不会得到结果还会造成内存泄露。
那么我们可以使用智能指针如下图
代码 这样还是没用当函数一结束智能指针对象counter还是立即释放。
运行结果 原因分析 当前的代码中智能指针counter从来没有被复制所以它的引用计数就只是1当所处的函数结束减至0于是释放。这效果和当初的栈对象版本有何区别
思路
前面说到链式任务即上一个任务结束前负责产生下一个任务所有的异步任务都被丢给io_service对象管理然后请看例中ios对象它在main()中定义所以虽不是全局变量但至少在main()函数内将一直存活。
如果我们在每次产生新任务丢给io_service对象时
都至少复制一次counter,一并丢给ios对象处理智能指针counter所指向的实质一下就将像接力跑中的接力棒一样一直存活直至链式任务反应结束。
既然要走链式传递智能指针的路也就同样面临两个关键环节。第一个环节是什么时候创建出智能指针。这一步已经完成就在“launch_rocket()”函数中 第二个环节是产生新任务的环节如何复制该智能指针先看现有的代码终点是划线的那行 有一个好消息async_wait()函数的入参用到this,意味着正好把当前对象*this又传递下去了。当前对象*this是传给“_timer”对象然后再由“_timer”对象作为事件回调所需的一个入参传递给io_service对象。
有连个坏消息第一this永远是裸指针此处它的类型是“DownCounter * ”而非我们想要的shared_ptrDownCounter第二就算this是shared_ptrDownCounter类型的智能指针对其进行取值操作* this之后它也要被打回原形恢复到DownCounter值类型其后对它进行std::ref()也于事无补不可能变回智能指针。