愚公移山

死而后已

C++博客 首页 新随笔 联系 聚合 管理
  1 Posts :: 11 Stories :: 0 Comments :: 0 Trackbacks

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

RAIIResource 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_ptrtr1::shared_ptr两者都在析构函数内做delete而不是delete[]动作。意味着两者都不能用在动态分配的数组上。

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

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

 

请记住:

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

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

posted on 2007-11-28 00:50 Nathan.Yu 阅读(95) 评论(0)  编辑 收藏 引用 所属分类: Effective C++(3E)读书笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理