3. 资源管理(条款:13-17)

条款13: 以对象管理资源。

a. 资源泄露:

#include <iostream>
using namespace std;
struct INT
{
	int v;
	INT(int x) : v(x) { cout << "INT constructor called." << endl; }
	~INT() { cout << "INT deconstructor called." << endl; }
};
int main()
{
	INT *tmp = new INT(6);
	cout << (*tmp).v << endl;
	cout << tmp->v << endl;
}

(没有调用析构函数,资源在堆中没有释放)

b. 用对象管理资源:

template<typename T> class Resource_ptr /* 加入管理类型 Resource_ptr */
{
public:
	Resource_ptr (T *p = NULL) : r_ptr(p) { cout << "Resource_ptr constructor called;" << endl; }
	~Resource_ptr ()
	{
		cout << "Resource_ptr deconstructor called; " << endl;
		if(r_ptr) delete r_ptr;
	}

	const T& operator* () const { return *r_ptr; }
	T& operator* () { return *r_ptr; }

	const T* operator-> () const { return r_ptr; }
	T* operator-> () { return r_ptr; }

	/*T* get() { return r_ptr; }*/
private:
	T *r_ptr;
};

typedef Resource_ptr<INT> R_ptr;

int main()
{
	/*INT *tmp = new INT(6);*/
	R_ptr tmp = R_ptr(new INT(6));
	cout << (*tmp).v << endl;
	cout << tmp->v << endl;
}

(利用对象,通过 delete 调用析构函数释放资源)

时间: 2024-10-13 14:58:10

3. 资源管理(条款:13-17)的相关文章

Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们

Effective C++——条款13(第3章)

第3章    资源管理 Resource Management 所谓资源就是,一旦用了它,将来必须还给系统.C++程序中最常使用的资源就是动态内存分配(如果分配内存从来都增归还,会导致内存泄露).其他常见的资源还有文件描述符(file descriptors),互斥锁(mutex locks),图形界面中的字型和笔刷,数据库连接,以及网络sockets.不论哪一种资源,重要的是,不再使用它时,必须将它还给系统. 条款13:    以对象管理资源 Use objects to manage res

effective c++ 条款13 use object to manage resources.

请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现. 简单说就是用object来管理资源. 以内存资源为例 class Investment {}; Investment* creatInvestment(){...} // factory function to produce investment object void main() { Investment* pInv = creatInvestment();//call t

Java 学习笔记(2015.7.13~17)

Java 学习笔记(2015.7.13~17) Java this关键字 表示本类中的属性,调用本类中的方法 class Person {        private String name;         private int age;         public Person(String name, int age) {         this.name = name;//调用本类中的属性         this.age = age;//同上} //get&set方法:    

effective C++ 读书笔记 条款12与条款13

条款12:确定你的public继承塑膜出is-a关系: 这个条款主要将了一些特殊情况:比如企鹅是鸟,企鹅可以继承于鸟,但是鸟会飞,企鹅却不能飞:还有让正方形继承矩形可能也会造成这种尴尬! 这个问题以前想过,但是不知道怎么解决,如果现实生活当中确实要这么使用:比如 猫 狗 鱼  猪等等许多动物继承Animal类,但是猫狗等不会游泳, 假如这里是有很多动物,不能采用鱼里面专门加一个方法!  这个现在还没想出来,条款12也没有讲如果要这么用该怎么处理就是将要避免这样. is - a; 在面向对象程序设

《Effective C++ 》学习笔记——条款13

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 三.Resource Management 到了第三张了,这一章主要讲述的就是资源的管理. ①.OK,首先,什么是资源--一旦使用,就必须还给系统的东西.C++程序员最长使用的资源就是动态分配内存(因为如果你分配内存却不曾归还,会导致内存泄露),但显然内存只是你

CSS3秘笈第三版涵盖HTML5学习笔记13~17章

第13章,构建基于浮动的布局 使用的是float(浮动)属性 注:float:none值将取消所有浮动,通常只用来取消元素中已经应用的浮动. 切记:不需要给正文的div设计宽度,即使设计成固定宽度也不用 用浮动进行布局 LayoutGala网站(http://blog.html.it/layoutgala/)上提供了40种不同的CSS设计,但大多只是基本框架,里面只有<div>标签及其定位用的CSS代码 布局生成器,Cridinator(http://gridinator.com)提供了简单的

1.13.17

17:文字排版 描述 给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻的标点符号).请将短文重新排版,要求如下: 每行不超过80个字符:每个单词居于同一行上:在同一行的单词之间以一个空格分隔:行首和行尾都没有空格. 输入第一行是一个整数n,表示英文短文中单词的数目. 其后是n个以空格分隔的英文单词(单词包括其前后紧邻的标点符号,且每个单词长度都不大于40个字母).输出排版后的多行文本,每行文本字符数最多80个字符,单词之间以一个空格分隔,每行文本首尾都没有空格.样例输入 84 One

读13~17章 本学期最后一次

学期也快结束了,不知不觉就过了一个学期,这是最后一次阅读书本的最后几章,也是读最多章数的一次. 第13章: 这章讲的是测试,各种各样的测试,像测试的分类有着功能,非功能等.还可以按软件测试的时机或作用来分类使用等,就是说软件测试更为全面的检测软件,在最后一个阶段得知软件能否上市等.单元测试可以说是软件测试的基础,书本中也介绍了测试时需要的注重的哪些部分. 问题:对于这么多种的测试方法,怎么才能最有效的选取? 第14章: 这章讲的是质量的保障,例如软件的质量,程序的质量等. 要明白自己项目的特点,

More Effective C++ 条款13 以reference方式捕捉exception

1. 由条款12知,如果catch子句捕获异常采用按值传递,那么被抛出的异常要被复制两次,这降低了效率,而且将派生类对象传给基类对象有可能会产生切割问题,但是按值传递也有它的好处,在catch子句重新throw异常的时候,它可以选择throw经catch子句处理过的异常还是原来的异常,这增加了灵活性(throw;) 2. 按指针传递似乎可以避免异常的复制,(虽然指针还是要被复制,不过4字节的代价不高),但是要注意指针指向的不能是局部对象,因为局部对象会被销毁,这就要求指针指向动态分配的内存,但由