3 资源管理
~~~~~~~~~~~
3.1 以对象管理资源
===================
1. 标准程序库提供的auto_ptr,其析构函数自动对所指对象调用delete.
- auto_ptr<T> pT(new T());
2. 由于auto_ptr会自动删除所指之物,故一定别让多个auto_ptr指向同一对象,否则对象被删除多次的后果是未定义的.
为了防止这个问题,auto_ptr有一个不同寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权.
由于STL容器要求元素发挥正常的复制行为,因此这些容器不能存auto_ptr
auto_ptr的替代方案是引用计数型智慧指针(reference-counting smart pointer RCSP)
例如TR1的tr1:shared_ptr
3. auto_ptr和tr1::shared_ptr的析构函数内做的是delete而不是delete[]动作,故不能在动态分配的数组上使用auto_ptr和tr1::shared_ptr,不过数组基本上可以被vector所取代
4. 以对象管理资源的两个关键想法是
* 获得资源后立刻放入管理对象中
* 管理对象运用析构函数确保资源被释放
3.2 在资源管理类中提供对原始资源的访问
=======================================
1. tr1::shared_ptr和auto_ptr都提供一个get成员函数,会返回智能指针内部的原始指针.
2. 可以通过显式提供get方法返回原始指针,
也可以提供隐式转换函数的方法转型为原始指针
- class ResourceHandler{
- public:
- operator Resource() const
- { return res;{
- private:
- Resource res;
- }
但是这个隐式转换函数可能会使客户在需要使用ResourceHandler的地方错误地转换成为Resource
3.3 以独立语句将newd对象置入智能指针
=====================================
1. 当构造函数是个explicit构造函数,无法进行隐式转换
2. 像Func(ResourceHandler(new Resource),otherHandler)这样的语句,有可能获得的操作序列为new Resource,otherHandler,ResourceHandler(),
由于在资源被创建(new Resource)和资源被转换为资源管理对象(ResourceHandler())之间的otherHandler可能发生异常干扰故而可能发生资源泄露.
解决的办法就是分离语句,分别写出1.创建新资源并放入智能指针中(rh=ResourceHandler(new Resource)),2.将智能指针传入函数内(Func(rh,otherHandler)).