【复读EffectiveC++17】条款17:以独立语句将newed对象置入智能指针

条款17:以独立语句将newed对象置入智能指针

此条款,依然是针对智能指针的补充,内容分为两个部分:

  • 有什么问题
  • 怎么解决

一、有什么问题

取原书的例子:
写一个函数,用来揭示程序处理的优先权。
再写一个函数,用来在某动态分配得到的Widget上进行某些带有优先权的处理:

int priority();//依据”以对象管理资源“的原则,决定对动态分配的来的Widget运用智能指针,这里采用trl::shared_ptr
void processWidget(std::trl::shared_ptr<Widget> pw,int priority);

现在考虑调用processWidget,这里会出现两个问题。

1、问题一

processWidget(new Widget,priority());

但这个函数调用不能通过编译,因为在tr1::shared_ptr构造函数需要一个原始指针,但该构造函数是个explicit构造函数,无法进行隐式转换,也就是不能将“new Widget”返回的原始指针直接隐式转换为processWidget需要的tr1::shared_ptr。

2、问题二

因此用下面会通过编译的代码:

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

虽然这样能顺利通过编译,并且使用了”以对象管理资源“,但这样调用却可能出现资源泄露。

在调用processWIdget之前,准备参数会做三件事:

  • 调用 priority
  • 执行 new Widget
  • 调用 trl::shared_ptr 构造函数

但这里我没有对三件事进行有序排列,是因为存在一个问题,即C++编译器会以什么样的次序完成这些事情呢?

这里可以确定 执行 new Widget 一定先于 调用 trl::shared_ptr 构造函数 被调用,因为这个表达式的结果还要被传递作为trl::shared_ptr构造函数的一个实参。

但是对 调用 priority 是排在第一或第二或第三执行,就不一定了。

假设其排在第二执行,总体操作顺序将会是:

  1. 执行”new Widget“
  2. 调用priority
  3. 调用trl::shared_ptr构造函数

更巧的是,如果在这个过程中,对调用priority出现异常,会让第三步的调用trl::shared_ptr构造函数没有发生,new Widget调用后返回的指针不会被置入trl::shared_ptr内,造成用来防止资源泄露的机制失效。

二、怎么解决

解决方法很简单:

  • 创建Widget,将它置入一个智能指针内,然后将那个智能指针传给processWidget;

代码如下:

std::trl::shared_ptr<Widget> pw(new Widget)//以智能指针存储newed所得的对象作为一条单独的语句
processWidget(pw,priority());//这个调用动作不会造成资源泄露

三、总结

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

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

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

相关文章

Opencv图像 ROI 与 mask 掩膜(找到感兴趣的区域)

在OpenCV中&#xff0c;可以使用ROI&#xff08;Region of Interest&#xff09;技术来处理图像中的感兴趣区域。ROI是指图像中的一个子区域&#xff0c;它可以是矩形、多边形或其他形状。使用ROI技术可以在不影响图像其他部分的情况下&#xff0c;对图像的某个区域进行操作。 …

【Python函数和类4/6】递归与匿名函数

目录 目标 匿名函数 多个形参 匿名函数的局限性 递归 语言例子 数学例子 递归的实现 递归代码 练习 总结 目标 在之前的博客中&#xff0c;我们学习了定义函数、调用函数以及设置函数的参数。在今天&#xff0c;我们会补充函数的两个常见的知识点&#xff0c;一个是匿…

学浪视频怎么缓存?

缓存学浪视频轻而易举&#xff01;推荐使用“小浪助手”&#xff0c;一款便捷的工具&#xff0c;助你轻松实现。工具已经预先打包好&#xff0c;需要的朋友可以自行下载。快试试&#xff0c;畅享学习吧&#xff01; 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1y7vcq…

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用&#xff0c;使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器&#xff0c;提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类&#xff0c;根据XML文件中的定义加…

STL--什么是迭代器的失效

迭代器失效指的是当容器发生变化时&#xff0c;之前获取的迭代器不再指向有效的元素或者不再有意义&#xff0c;这种情况在 C STL 编程中比较常见。迭代器失效主要发生在以下几种情况&#xff1a; 1.元素被删除或修改: 如果你删除了某个迭代器所指向的元素&#xff0c;那么这个…

RetinalNet论文笔记

RetinalNet 概述1. 引言2. 相关工作3. 焦点损失4. RetinaNet Detector 检测器5. 实验6. 结论 3. Focal loss3.1. 平衡交叉熵3.2. 焦点损失定义3.3. 类别不平衡和模型初始化3.4. 类别不平衡和两阶段检测器 4. RetinaNet Detector特征金字塔网络骨干&#xff08;Feature Pyramid …

前端的导航栏数据是前端自己写好还是建议从后端拿数据渲染出来吗?

关于前端导航栏的数据来源&#xff0c;这实际上取决于具体的项目需求和应用场景。以下是两种方式的优缺点&#xff0c;供您参考&#xff1a; 前端自己写好&#xff1a; 优点&#xff1a; 加载速度快&#xff1a;导航栏数据直接嵌入前端代码中&#xff0c;无需等待后端接口响…

PostgreSQL入门到实战-第二十五弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(九)官网地址PostgreSQL概述PostgreSQL中NATURAL JOIN命令理论PostgreSQL中NATURAL JOIN命令实战更新计划 PostgreSQL中表连接操作(九) 使用PostgreSQL NATURAL JOIN从两个表中查询数据。 官网地址 声明: 由于操作系统, 版本更新…

Failed to resolve ‘bss.myhuaweicloud.com‘ ([Errno -2] Name or service not know

Failed to resolve ‘bss.myhuaweicloud.com’ ([Errno -2] Name or service not know 解決方案&#xff1a; 修改/etc/resolv.conf文件来指定DNS服务器&#xff0c;例如添加Google的公共DNS服务器&#xff1a; nameserver 8.8.8.8 nameserver 8.8.4.4

【软件设计师知识点】九、网络与信息安全基础知识

文章目录 计算机网络的概念网络分类网络拓扑结构网络体系结构ISO/OSI 7层参考模型TCP/IP 4层模型TCP/IP 协议族应用层协议传输层协议网络层协议IP 地址IPV4 数据报IP 地址分类子网划分子网掩码IPv6地址

C++实现AVL树

文章目录 一、平衡树的优势二、二叉平衡搜索树的节点定义三、二叉搜索树的插入3.1 寻找插入位置3.2 开始判定平衡因子&#xff0c;平衡因子有变就开始旋转3.2.1 左旋的情况3.2.2 左旋代码&#xff08;一定要考虑平衡因子为2或者-2的节点是否有父节点&#xff09;3.2.2 右旋的情…

mybatis分页实现总结

1.mybatis拦截器相关知识 1.作用 mybatis的拦截器是mybatis提供的一个拓展机制&#xff0c;允许用户在使用时根据各自的需求对sql执行的各个阶段进行干预。比较常见的如对执行的sql进行监控&#xff0c;排查sql的执行时间&#xff0c;对sql进行拦截拼接需要的场景&#xff0c…

DC-5渗透测试复现

DC-5渗透测试复现 目的&#xff1a; 获取最高权限以及5个flag 过程&#xff1a; 信息打点-文件包含漏洞-弹shell- scren-4.0.5提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.136) 靶机&#xff1a;DC_3(192.168.85.134) 复现&#xff1a; 一.信息收集 nma…

PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)

目录 前言 需求场景 用例图 类图 活动图 时序图 前言 在软件开发的生命周期中&#xff0c;需要先进行设计&#xff0c;最后才是进行具体的编码和测试。设计时就需要画各种 UML 图&#xff0c;有专业的 UML 画图软件&#xff0c;也有很多在线的 UML 画图网站可以来画图&a…

哈希表函数 —— uthash的简单使用

目录标题 哈希表函数 —— uthash的简单使用添加头文件定义结构体哈希表的初始化哈希表的添加哈希表的添加哈希表的排序 哈希表函数 —— uthash的简单使用 添加头文件 在使用uthash函数实现哈希表前&#xff0c;要先添加头文件&#xff1a; #include "uthash.h"定…

Dubbo面试回答简单版

一、dubbo特性 超时重试机制地址缓存多版本负载均衡&#xff1a;随机、权重轮询、最少活跃调用、一致性哈希集群容错&#xff1a;失败重试、快速失败、失败安全、失败自动恢复、并行调用、广播服务降级&#xff1a;异常时返回mock 集群容错 FailOver 失败重试&#xff0c;读…

链表算法题总结(二十一天)

203. 移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&…

正方形(c++题解)

题目描述 给定一组不同长度的木棍&#xff0c;是否有可能将它们端对端地连接起来形成 个正方形? 输入格式 第1行输入包含N&#xff0c;即测试数据的数量。 每组测试数据第一个数为 &#xff0c;即木棒的根数。之后有 个整数&#xff0c; 每个都给出了一根棍子的长度 。 …

求存款本息和(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double P 1000, r1 0.015, r2 0.021, r3 0.0275, r4 0.03, r5 0.0035;int judge 0;//…

富文本编辑器的下载安装使用

为什么选择vue-quill-editor&#xff1f; 在众多的富文本编辑器中&#xff0c;vue-quill-editor因其易用性、灵活性以及对Vue框架友好的特性而受到开发者的青睐。它基于Quill编辑器&#xff0c;Quill是一款现代的WYSIWYG&#xff08;所见即所得&#xff09;编辑器&#xff0c;…