第13章 网络 Page734 “I/O对象”的链式传递 单独的火箭发射函数,没有用对的智能指针

本文主要是介绍第13章 网络 Page734 “I/O对象”的链式传递 单独的火箭发射函数,没有用对的智能指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇博文中,我们使用单独的火箭发射函数,结果什么结果也没有得到,原因是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_ptr<DownCounter>;第二,就算this是shared_ptr<DownCounter>类型的智能指针,对其进行取值操作(* this)之后,它也要被打回原形,恢复到DownCounter值类型,其后对它进行std::ref()也于事无补,不可能变回智能指针。

这篇关于第13章 网络 Page734 “I/O对象”的链式传递 单独的火箭发射函数,没有用对的智能指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713502

相关文章

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以