Effective C++ 学习笔记 条款17 以独立语句将newed对象置入智能指针

假设我们有个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理:

int priority();void processWidget(std::st1::shared_ptr<Widget> pw, int priority);

由于谨记“以对象管理资源”(条款13)的智慧铭言,processWidget决定对其动态分配得来的Widget运用智能指针(这里采用tr1::shared_ptr)。

现在考虑调用processWidget:

processWidget(new Widget, priority());

等等,不要考虑这个调用形式。它不能通过编译。tr1::shared_ptr构造函数需要一个原始指针(raw pointer),但该构造函数是个explicit构造函数,无法进行隐式转换,将得自“new Widget”的原始指针转换为processWidget所要求的tr1::shared_ptr。如果写成这样就可以通过编译:

processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());

令人惊讶的是,虽然我们在此使用“对象管理式资源”(object-managing resources),上述调用却可能泄露资源。稍后再翔加解释。

编译器产出一个processWidget调用码之前,必须首先核算即将被传递的各个实参。上述第二实参只是一个单纯的对priority函数的调用,但第一实参std::tr1::shared_ptr<Widget>(new Widget)由两部分组成:
1.执行“new Widget”表达式。

2.调用tr1::shared_ptr构造函数。

于是在调用processWidget之前,编译器必须创建代码,做以下三件事:
1.调用priority。

2.执行“new Widget”。

3.调用tr1::shared_ptr构造函数。

C++编译器以什么样的次序完成这些事情呢?弹性很大。这和其他语言如Java和C#不同,那两种语言总是以特定次序完成函数参数的核算。可以确定的是“new Widget”一定执行于tr1::shared_ptr构造函数被调用之前,因为这个表达式的结果还要被传递作为tr1::shared_ptr构造函数的一个实参,但对priority的调用则可以排在第一或第二或第三执行。如果编译器选择以第二顺位执行它(说不定因此生成更高效的代码,谁知道),最终获得这样的操作序列:
1.执行“new Widget”。

2.调用priority。

3.调用tr1::shared_ptr构造函数。

现在请你想想,万一对priority的调用导致异常,会发生什么事?在此情况下“new Widget”返回的指针将会遗失,因为它尚未被置入tr1::shared_ptr内,后这是我们期盼用来防止资源泄露的武器。是的,在对processWidget的调用过程中可能引发资源泄露,因为在“资源被创建(经由“new Widget”)”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰。

避免这类问题的办法很简单:使用分离语句,分别写出:
1.创建Widget。

2.将它置入一个智能指针内,然后再把那个智能指针传给processWidget。

std::tr1::shared_ptr<Widget> pw(new Widget);    // 在单独语句内以智能指针存储newed所得对象
processWidget(pw, priority());    // 这个调用动作绝不至于造成泄漏

以上之所以行得通,因为编译器对于“跨越语句的各项操作”没有重新排列的自由(只有在语句内它才拥有那个自由度)。在上述修订后的代码内,“new Widget”表达式以及“对tr1::shared_ptr构造函数的调用”这两个动作,和“对priority的调用”是分隔开来的,位于不同语句内,所以编译器不得在它们之间任意选择执行次序。

请记住:
以独立语句将newed对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx读写锁的实现逻辑

我们一般认为nginx是一个多进程单线程的应用服务&#xff0c;虽然nginx在一个worker进程内是没有数据竞争问题的&#xff08;因为是单线程&#xff09;&#xff0c;但是不免nginx在多个进程间还有一些需要共享的数据&#xff0c;譬如ngx_http_upstream_zone_module模块将peers数…

Pytorch入门实战 P1-实现手写数字识别

目录 一、前期准备&#xff08;环境数据&#xff09; 1、首先查看我们电脑的配置&#xff1b; 2、使用datasets导入MNIST数据集 3、使用dataloader加载数据集 4、数据可视化 二、构建简单的CNN网络 三、训练模型 1、设置超参数 2、编写训练函数 3、编写测试函数 4、…

子事务的应用

子事务的应用 1. 为什么要使用子事务&#xff1f; 为了防止接口执行失败时&#xff0c;导致事务回滚&#xff0c;接口日志记录不到日志表里面&#xff0c;因而将记录日志表的方法写成子事务的方法。 2. 怎么使用子事务&#xff1f; 在方法名后面加上“_RequiresNew”&#xff…

文物藏品信息管理系统的优势

本系统支持一普标准所有管理信息&#xff0c;包括保管信息、基本情况、鉴定信息、考古发掘信息、来源信息、流传经历、损坏记录、移动记录、修复记录、展览信息、著录信息、收藏单位信息等的管理和维护。 能够实现对藏品信息进行动态管理&#xff0c;提供藏品信息管理指标的维护…

《人工智能怎么学》荣获2023年吴文俊人工智能科学技术奖及赠书活动

中国人工智能学会官网&#xff08;www.caai.cn&#xff09;近日正式公布了2023年吴文俊科学技术奖获奖名单&#xff0c;图书《人工智能怎么学》项目被授予2023年吴文俊人工智能科学技术奖科技进步奖&#xff08;科普项目&#xff09;。2023年吴文俊科学技术奖完整获奖名单见htt…

YOLOv8官方仓库更新,添加YOLOv9模型

目录 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; 摘要 PGI&GELAN 代码实现 实验结果 消融实验 可视化 结论 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查…

PHP接口代码-在线实名认证-身份实名认证

在我国&#xff0c;身份证是证明身份的证件&#xff0c;我们在生活、工作中都会用到。一般入职一个新公司的时候人事部门的工作人员会让入职人员提供身份证&#xff0c;一是帮员工办理社保等业务和员工档案用&#xff0c;另外还可以用来验证身份。现在科技发达&#xff0c;不仅…

开发充电桩APP提高管理效能

随着社会的发展&#xff0c;电动车已经成为城市交通的重要组成部分&#xff0c;用户所下载的充电类的APP也非常大&#xff0c;而充电桩的建设和利用效率成为了一个亟待解决的问题。在这个背景下&#xff0c;物联网技术的应用成为了提高充电桩效能的关键。虎克技术公司在此领域提…

CyberChef加密解密RSA、AES中文乱码问题有效解决办法

一、AES加密 AES的ECB模式加密&#xff0c;秘钥&#xff1a;1234567812345678 加密效果与utf-8本地加密一致 二、AES解密 AES的ECB模式解密&#xff0c;秘钥&#xff1a;1234567812345678 同理RSA加密设置一样

[C语言]——分支和循环(4)

目录 一.随机数生成 1.rand 2.srand 3.time 4.设置随机数的范围 猜数字游戏实现 写⼀个猜数字游戏 游戏要求&#xff1a; &#xff08;1&#xff09;电脑自动生成1~100的随机数 &#xff08;2&#xff09;玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的⼤…

【notepad++工具使用之】批量加逗号

背景 在使用sql语句in关键字查询时&#xff0c;我们需要把数据用逗号进行隔开&#xff0c;在数据量非常少的时候&#xff08;十几二十个这样&#xff09;&#xff0c;可以手动的去加逗号分隔符&#xff1b; 但是遇到1000个怎么弄呢&#xff1f; 强大的Notepad 批量处理数据时…

百度智能云发布会定档3月21日,新模型ERNIE Speed已悄然上线

正文 百度智能云官微日前宣布&#xff0c;百度智能云千帆产品发布会&#xff08;AI Cloud Day&#xff09;将于2024年3月21日在北京举行&#xff0c;届时将揭晓千帆ModelBuilder 和 AppBuilder 的最新产品进展&#xff0c;并发布系列新模型及开发工具组件。 记者在百度智能云…

最新的前端开发技术(2024年)

关于作者&#xff1a; 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0…

如何实现数据中心布线变更管理?

前言 随着科技的不断发展&#xff0c;数据中心作为企业的核心基础设施之一&#xff0c;承载着大量重要的业务数据。在数据中心运维过程中&#xff0c;变更管理流程变得尤为重要&#xff0c;它是确保数据中心基础设施稳定运行和保障数据安全的关键环节。变更管理的定义是指在维…

【开源】SpringBoot框架开发快乐贩卖馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

ue WebUI插件下载官方Github方法

首先要先将EPIC账号绑定Github账号 这个网上有很多教程 我就不细说了 绑定以后点击这个链接 https://github.com/tracerinteractive/UnrealEngine 进去后是这样的 点击这里 下滑找到对应版本下载即可 好了就这样 别被割韭菜了

AI自然语言中默认上下文长度4K 几K是什么意思?

环境&#xff1a; 4K 问题描述&#xff1a; AI自然语言中默认上下文长度4K 几K是什么意思&#xff1f; 解决方案&#xff1a; 在自然语言处理中&#xff0c;“k” 表示 “千”&#xff0c;是一种简写方式。当我们说 “4k” 时&#xff0c;实际上指的是 “4,000”。在上下文…

微服务架构 | 实战常见数据

INFDEX 压测参考值&#xff08;180C&#xff09;线程池Qps/Tps 压测参考值&#xff08;180C&#xff09; 时长TPSTPS极限TP性能TP极限并发CPU负载一般接口5min500200050/100ms120ms1->10/3040%缓存接口5min5000200007/20ms10/25ms1->2/440%一般写接口关键写接口 线程池…

3月6日做题总结(C/C++真题)

星光不负赶路人&#xff0c;时光不负追梦人&#xff01;多一份努力&#xff0c;多一份成功的机会&#xff01; 第一题 int a, b, x, i; a 3; b 4; i 3; x a > b ? i : i--; x的值为&#xff08;&#xff09; A---2 B---3 C---4 D---5 正确答案&#xff1a;B 解…

【射频连接器】SMB/SMC 同轴连接器

阻抗为 50 欧姆的 Connex SMB/SMC 超小型同轴连接器适用于 4 GHz &#xff08;SMB&#xff09; 或 10 GHz &#xff08;SMC&#xff09; 的应用。这些连接器通常比 SMA 便宜&#xff0c;主要用于微波电话和其他非国防电信要求的应用。 SMB 连接器具有快速连接/断开卡扣式配接功…