第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

相关文章

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的