Effective C++读书笔记 资源管理(之一)

news/2024/5/18 21:36:31 标签: 读书, c++, raii, initialization, delete, sockets
 

Effective C++读书笔记

--By Nathan.Yu 2007-11-27--

3 资源管理(之一)

常见的资源:文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面中的字型和笔刷、数据库连接、网络sockets

 

不论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统。

条款13:以对象管理资源(Use objects to manage resources)

auto_ptr是一个“类指针(pointer-like)对象”,也就是所谓的“智能指针”,其析构函数自动对其所指对象调用delete

RAII(Resource Acquisition Is Initialization):资源取得即初始化。

 

<注意>由于auto_ptr被销毁时会自动删除它所指之物,所以别让多个auto_ptr同时指向同一对象。为了预防这个问题,auto_ptrs有一个不寻常的性质:

       若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权!

由于这一诡异的复制行为,加上“受auto_ptrs管理的资源必须绝对没有一个以上的auto_ptr同时指向它”,意味着auto_ptr并非管理动态分配资源的神兵利器。

       STL容器要求其元素发挥“正常”赋值行为,因此不能用auto_ptr管理它们。

 

auto_ptr的替代方案是“引用计数型智能指针”(reference-counting smart pointer, RCSP)。

RCSPs提供的行为类似垃圾回收(GC, garbage collection),不同的是RCSPs无法打破环状引用(cycles of reference, 例如两个其实已经没被使用的对象彼此互指,好像还处在“被使用”状态)。

RCSPs举例:tr1::shared_ptr

 

<注意>auto_ptr和tr1::shared_ptr两者都在析构函数内做delete而不是delete[]动作。意味着两者都不能用在动态分配的数组上。

对数组可用容器如vector等代替。

然,boost::scoped_array和boost::shared_array则提供了上述管理数组的能力。

 

请记住:

1、             为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。

2、             两个被使用的RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。


http://www.niftyadmin.cn/n/1713806.html

相关文章

Effective C++读书笔记 之链接

主要包括导读和内存资源管理 http://www.cppblog.com/yugong/category/5652.html

Effective C++读书笔记 之导读

0 导读 1、设计策略 如何在两个不同的做法中择一完成某项任务&#xff0c;如 该选择inheritance(继承)还是templates&#xff08;模板&#xff09;&#xff1f;该选择public继承还是private继承&#xff1f;该选择private继承还是composition&#xff08;复合&#xff09;&a…

linux---vim---ctag

【前言】ctags是vim的一个非常有用的插件&#xff0c;可以大大提高程序编码(C、C)的效率&#xff0c;比如快速调整到函数、变量定义处等等常用 功能&#xff0c;更详细的功能&#xff0c;自行百度。【目的】在RHEL 5上面安装配置vim插件ctags 【前提条件】vim已经安装 【安装ct…

打造自己的专属Linux(一):快速建立一个小型Linux .

我的linux版本&#xff1a;redhat 5.4虚拟机客户端&#xff1a;Vmware Workstation 6.5我们分步骤来实现这个小型linux第一步&#xff1a;在虚拟机上添加一块新硬盘到linux&#xff0c;大小20G &#xff08;可以自定&#xff09;第二步&#xff1a;1)打开终端&#xff0c;使用f…

C++的拷贝构造函数(深拷贝、浅拷贝)

深拷贝和浅拷贝可以简单理解为&#xff1a;如果一个类拥有资源&#xff0c;当这个类的对象发生复制过程的时候&#xff0c;资源重新分配&#xff0c;这个过程就是深拷贝&#xff0c;反之&#xff0c;没有重新分配资源&#xff0c;就是浅拷贝。下面举个深拷贝的例子。 #include …

C++引用与指针的比较

C引用与指针的比较 引用是C中的概念&#xff0c;初学者容易把引用和指针混淆一起。 一下程序中&#xff0c;n是m的一个引用&#xff08;reference&#xff09;&#xff0c;m是被引用物&#xff08;referent&#xff09;。 int m; int &n m; n相当于m的别名&#xff08;…

C语言实现 HashTable

简单实现了哈希表的插入和查找功能&#xff0c;简要说明如下&#xff1a; 1、数据结构&#xff1a; struct HashNode { char* sKey; //键 int nValue; //值 HashNode* pNext; //当Hash值冲突时&#xff0c;指向HASH值相同的下一个节点。 } HashNode* hashTable[HASH_T…

读 《技术人员的成长》

下面的这篇文章对我的影响很大&#xff0c;可以说在我人生的拐角处帮了我一把。所以下面把它放到自己的博客里&#xff0c;望时刻激励自己。 首先&#xff0c;纠正一个流行的概念&#xff0c;估计大家都听说过“软件技术人员的工作寿命只能到30岁”。如果你相信这个说法&#x…