IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 条款 13:以对象管理资源 -> 正文阅读

[C++知识库]条款 13:以对象管理资源

条款 13:以对象管理资源

Use objects to manage resources

  1. 所谓资源就是,一旦用它,将来必须还你给系统。
  2. 单纯依靠函数进行资源释放行不通
//假设我们的程序库各类继承一个root类
class Investment{...};//投资类型,继承体系中的root class
//假设我们通过工厂产生对象
Investment* creatInvestment();//多态指针
//这是一个动态对象,调用者有责任 释放他
//假设用f()函数履行这个责任
void f(){
	Investment* pInv=creatInvestment();//调用工厂函数
	...//doSomething
	delete pInv;//释放对象
}
//这么写看起来妥当。但是有些情况下可能无法成功释放
//例如,doSomething提前出现一个return,而导致函数提前退出
//例如,doSomething时抛出一些异常,导致无法执行到delete语句
//无论是什么原因,delete被忽略会导致内存泄漏
//完美的语序自然可以避免该问题,但是换来的确实维护的代价
//所以单纯依靠函数进行资源释放行不通

  1. 把资源放进对象内,我们便可以依靠C++的析构函数 自动调用机制确保资源被释放。
  2. “以对象管理资源”的关键想法:1.获得资源后立即放进管理对象内。2.管理对象利用析构函数确保资源被释放
  3. 关于auto_ptr的一些知识:
//auto_ptr是类指针对象,也就是所谓的智能指针,
//其析构函数自动对其所指向的对象调用delete
//下面演示使用auto_ptr避免内存泄漏的可能性
void f(){
	//一如既往的调用工厂函数,使用pInv
	std::auto_ptr<Investment> pIvn(creatInvestment());
	...
	//经由auto_ptr的析构函数自动删除pIvn
}
//该例子给出了两个“以对象管理资源”的关键想法
//1.获得资源后立即放进管理对象内。
//2.管理对象利用析构函数确保资源被释放
//由于auto_ptr被销毁时会自动释放其所指之物,
//所以注意不要让多个auto_ptr指向一个对象,否则会导致
//同一对象的多次释放(释放不存在的资源),从而出错
//为了预防该问题,auto_ptr有一个性质:
//若通过复制构造函数,或复制复制操作符复制他们,
//他们会变成null,而复制所得指针将取得资源的唯一拥有权。

void f(){
	//pTnv1指向creatInvestment的返回物
	std::auto_ptr<Investment> pInv1(creatInvestment());
	atd::auto_ptr<Investment> pInv2(pInv1);//现在pInv2指向对象
									//pInv1变为null
	pInv1=pInv2;//现在pInv1指向对象
			//pInv2变为nul
}
//通过上述例子可以看到我们描述的例子
//而且可以看到,auto_ptr限制了指针正常的复制行为。
//所以auto_ptr也不是一个管理资源的万能利器

//auto_ptr的替代方案是“引用计数型智慧指针”(RCSP)
//所谓的RCSP也是一个智能指针,持续追踪共有多个对象指向某笔资源
//并在无人指向他们时自动删除该资源
//RCSP的行为类似垃圾回收机制
//但是RSCP不能打破“环状引用”,
//例如两个其实已经没有被使用的对象彼此互指,因而好像还在被使用状态

//TR1的tr1::shared_ptr就是个RCSP
void f(){
	//一如既往的调用工厂函数,使用pInv
	std::tr1::shared_ptr<Investment> pIvn(creatInvestment());
	...
	//经由shared_ptr的析构函数自动删除pIvn
}
//该代码看起来与上一个例子相似,但是却比它正常得多
void f(){
	//pTnv1指向creatInvestment的返回物
	std::tr1::shared_ptr<Investment> pInv1(creatInvestment());
	atd::tr1::shared_ptr<Investment> pInv2(pInv1);//现在pInv2指向对象
									//pInv1也指向该对象
	pInv1=pInv2;//同上,无变化。
	...//当pInv1,pInv2均被销毁,其所指的对象也被销毁
}
//还有一点应当注意的是上述的两种智能指针
//在其析构函数内调用delete而不是delete []动作(条款16说明),
//所以在动态分配的array身上使用智能指针不是一个好主意

请记住

1. 为防止资源泄漏,请使用资源管理对象,他们在构造函数中获得资源并在析构函数中释放资源.
2. 两个常被使用的资源管理对象是tr1::shared_ptr和auto_ptr.前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使他(被复制物)指向null.

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:36:17  更:2021-09-20 15:37:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:06:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码