Effective C++读书笔记——item13(使用对象管理资源)

1. 资源管理问题背景

class Investment { ... };            // root class of hierarchy of// investment types
Investment* createInvestment();      // return ptr to dynamically allocated// object in the Investment hierarchy;// the caller must delete it// (parameters omitted for simplicity)
void f()
{Investment *pInv = createInvestment();         // call factory function...                                            // use pInvdelete pInv;                                   // release object
}
  • 在使用如createInvestment这类返回动态分配对象指针的函数时,若仅依靠手动在合适位置(如函数末尾)调用delete来释放资源,存在诸多导致资源泄漏的风险。例如函数中间出现提前的return语句、循环因continuegoto提前退出、语句抛出异常等情况,都可能使delete语句无法执行,进而不仅泄漏对象内存,还包括对象持有的其他资源。

2. 使用对象管理资源的理念(RAII)

  • 核心观念:将资源放入一个对象内部,利用 C++ 自动调用析构函数的机制确保资源被释放,此即 Resource Acquisition Is Initialization(RAII)理念。获取资源后应立即移交给资源管理对象,常见方式是用获取的资源初始化资源管理对象,有时也可通过赋值操作移交资源,但重点是获取资源同时就将其交给资源管理对象。当对象离开其活动范围被销毁时,析构函数自动执行,从而保证资源能正确释放(除非释放资源时抛出异常,不过相关问题可参考 Item 8)。

3. 智能指针相关介绍

  • auto_ptr
    • 是一种智能指针,其析构函数会自动在指向的对象上调用delete。例如std::auto_ptr<Investment> pInv(createInvestment());这种使用方式,能自动管理资源释放。
    • auto_ptr有特殊的拷贝行为,拷贝(通过拷贝构造函数或拷贝赋值运算符)时会将原指针置为空,拷贝的指针获得资源唯一所有权,所以不能让多个auto_ptr指向同一个对象,否则会导致对象被多次删除,引发程序的未定义行为。并且由于其非 “正常” 的拷贝行为,不适用于 STL 容器等要求内含物有常规拷贝行为的场景。
  • tr1::shared_ptr(参考 Item 54)
    • 属于引用计数智能指针(RCSP),能跟踪指向特定资源的对象数量,当没有任何对象指向该资源时自动删除资源,行为类似垃圾收集,但不能解决循环引用问题。
    • 拷贝tr1::shared_ptr的行为符合常规预期,例如多个shared_ptr可以指向同一个对象,拷贝操作不会使原指针置空,这种特性使其能用于 STL 容器以及和auto_ptr不相容的环境中。
  • 使用注意事项auto_ptrtr1::shared_ptr在析构函数中使用的是delete而非delete [],所以不能用于管理动态分配的数组(虽然代码能编译,但会导致错误的删除形式),若要管理动态分配数组,可考虑 Boost 库中的boost::scoped_arrayboost::shared_array类。

4. 自定义资源管理类

  • 预制的资源管理类(如auto_ptrtr1::shared_ptr)虽方便遵循 RAII 理念进行资源管理,但有时可能无法满足特定需求,这时就需要自行精心打造资源管理类,相关的注意事项和细节是 Item 14 和 15 的主题内容。

5. 函数接口与资源泄漏防范

  • createInvestment这类返回裸指针的函数接口容易引发资源泄漏,因为调用者很容易忘记调用delete,即便使用智能指针来管理,也得记住将返回值存储到智能指针对象中,解决此问题涉及改变函数接口,这是 Item 18 的主题内容。

6. 关键要点总结

  • 为防止资源泄漏,要运用 RAII 对象,在其构造函数中获取资源,析构函数中释放资源。
  • tr1::shared_ptrauto_ptr是常用的 RAII 实现类,通常tr1::shared_ptr是更好选择,因其拷贝行为更符合直觉,而auto_ptr拷贝时会置空自身。

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

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

相关文章

Wsl报 不存在具有提供的名称的分布

在使用wsl --set-version Ubuntu 2命令升级WSL2时&#xff0c; 不存在具有提供的名称的分布&#xff0c;如下图。 图片 解决的办法也很简单&#xff0c;只需要把该命令的 Ubuntu 改为具体使用的发行版全称即可。此处&#xff0c;使用“wsl -l -v”命令显示安装的Ubuntu 版本。 …

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

计算机网络例题

IP地址分类&#xff1a; A类&#xff1a;网络号范围&#xff1a; 1~126 &#xff08;0000 0001 ~ 0111 1110&#xff09; B类&#xff1a;网络号范围&#xff1a;128.1 ~ 191.255 &#xff08;可用范围&#xff09; C类&#xff1a;网络号段范围&#xff1a;192.0.1 ~ 223.2…

【大数据基础】大数据概述

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识&#xff0c;分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数…

鸿蒙UI(ArkUI-方舟UI框架)

参考&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI&#xff08;方舟UI框架&#xff09;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff…

【Java项目】基于SpringBoot的【校园交友系统】

【Java项目】基于SpringBoot的【校园交友系统】 技术简介&#xff1a;系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等&#xff0c;总体功能模块运用自顶向下的分层思想。 系统简介&#xff1a;系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…

C#中的常用集合

目录 一、动态数组ArrayList 二、List 三、栈&#xff08;Stack&#xff09; 四、队列&#xff08;Queue&#xff09; 五、字典&#xff08;Dictionary&#xff09;,int> 一、动态数组ArrayList ArrayList 是 C# 中提供的一种动态数组类&#xff0c;位于命名空间 Syste…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器&#xff0c;为开发者提供了一个强大的平台来实施这些实践。然而…

WEB前端-2

目录 HTML-常见的网页标签-分类2 语义化标签 列表标签 表单标签 form标签 input标签 select标签 textarea标签 html转义符 h5提供的新标签 【例3&#xff1a;豆瓣电影】 【源码】 【例4&#xff1a;登录注册】 【源码】 【例5&#xff1a;QQ注册】 【源码】 H…

Nacos概述与集群实战

什么是Nacos,它有什么作用 Nacos 是一个开源的服务发现和配置管理平台,由阿里巴巴开发,用于构建云原生应用程序。Nacos 的名字源自于 “Naming and Configuration Service”(命名和配置服务)的缩写。它支持服务注册与发现、动态配置服务、动态服务管理等特性,广泛应用于微…

EtherCAT转Modbus网关与TwinCAT3的连接及配置详述

在工业自动化控制系统中&#xff0c;常常需要整合不同的通信协议设备。本案例旨在展示如何利用捷米特JM-ECT-RTU协议转换网关模块&#xff0c;实现 EtherCAT 网络与 Modbus 设备之间的无缝连接&#xff0c;并在 TwinCAT3 环境中进行有效配置&#xff0c;以构建一个稳定可靠的自…

目标检测中的Bounding Box(边界框)介绍:定义以及不同表示方式

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

YARN WebUI 服务

一、WebUI 使用 与HDFS一样&#xff0c;YARN也提供了一个WebUI服务&#xff0c;可以使用YARN Web用户界面监视群集、队列、应用程序、服务、流活动和节点信息。还可以查看集群详细配置的信息&#xff0c;检查各种应用程序和服务的日志。 1.1 首页 浏览器输入http://node2.itc…

Linux标准IOday3

1:思维导图 2 :使用3语言编写一个简易的界面&#xff0c;界面如下 1:标准输出流 2:标准错误流 3:文件流 要求:按1的时候&#xff0c;通过printf输出数据&#xff0c;按2的时候&#xff0c;通过perror输出数据&#xff0c;按3的时候将输入写入文件中&a…

Clickhouse基础(一)

操作命令&#xff1a; sudo clickhouse start sudo clickhouse restart sudo clickhouse status进入clickhouse clickhouse-client -mCREATE TABLE db_13.t_assist (modelId UInt64,taskId UInt64,testNo String,tdId UInt64,eventDay String,eventDaytime UInt64,eventBatch …

Ubuntu网络连接问题(笔记本更换wifi后,虚拟机连不上网络)

1、笔记本更换wifi后&#xff0c;虚拟机的IP地址变了&#xff0c;然后就连不上网络了&#xff08;主机笔记本连接wifi正常上网&#xff09; 2、修改子网地址&#xff08;按照ubutun的ip设置子网掩码&#xff09; 3、Ubuntu已经显示网络连接正常了&#xff0c;但是就是无法上网&…

Spring 项目 基于 Tomcat容器进行部署

文章目录 一、前置知识二、项目部署1. 将写好的 Spring 项目先打包成 war 包2. 查看项目工件&#xff08;Artifact&#xff09;是否存在3. 配置 Tomcat3.1 添加一个本地 Tomcat 容器3.2 将项目部署到 Tomcat 4. 运行项目 尽管市场上许多新项目都已经转向 Spring Boot&#xff0…

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

VS2022 安装和配置 vcpkg

vs2022使用vcpkg最全版本_vs2022 vcpkg-CSDN博客 Visual Studio 2022 安装和配置 vcpkg_vs2022 vcpkg-CSDN博客 GitHub - microsoft/vcpkg: C Library Manager for Windows, Linux, and MacOS vcpkg 文档 | Microsoft Learn 没有详细教程写出来&#xff0c;先大概看看&#x…

【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜

AI的两次寒冬&#xff1a;从感知机困局到深度学习前夜 引用&#xff08;中英双语&#xff09; 中文&#xff1a; “第一次AI寒冬&#xff0c;是因为感知机局限性被揭示&#xff0c;让人们失去了对算法可行性的信心。” “第二次AI寒冬&#xff0c;则是因为专家系统的局限性和硬…