C++中常见的资源就是动态内存分配,常见的还有文件描述符、互斥锁、图形界面的字形和笔刷、数据库连接、以及网络sockets。不论哪一种资源,当你不再使用它时,必须将它还给系统。
一、以对象管理资源
1. 获得资源后立刻放进资源管理对象内。
2. 管理对象运用析构函数确保资源被释放。(if 资源释放时导致抛出异常,又该如何呢?)
标准c++提供auto_ptr指针来避免潜在的资源泄漏可能性。 (auto_ptr的使用?)
auto_ptr复制动作会使被复制物指向NULL。
auto_ptr管理的资源必须绝对没有一个以上的auto_ptr同时指向它,也就意味着stl容器容不得auto_ptr。无法发挥正常的复制行为。
智能指针(RCSP:引用计数型智慧指针)替换auto_ptr,行为类似垃圾回收,但无法打破环状引用(cyclesof reference?)
std::tr1::shared_ptr的效率没有boost::shared_ptr好
二、在资源管理类中小心copying行为
RAII:资源取得时机便是初始化时机。
1. 禁止复制 。RAII对象被复制并不合理。
例: CLock ml1(&m); //锁定互斥量m
CLock ml2(ml1);//将ml1复制到ml2上(不妥)
2.对底层资源祭出引用计数
class CLock{
public :
explicit CLock(Mutex *pm):
mutexPtr(pm unlock)
{
lock(mutexPtr.get());
}
private:
std::tr1::shared_ptr<Mutex> mutexPtr;
};
3. 复制底部资源 deep copying
4.转移底部资源的拥有权
三、在资源管理类中提供对原始资源的访问
显示转换 : get成员函数
隐式转换 : 指针取值操作符(operator-> 和operator*)