【读书笔记】Effective C++—3 资源管理(之1)

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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值