资源管理
条款13
以对象管理资源
为防止资源(内存,文件描述符,socket,mutex等)泄露,请使用RAII,即在构造函数中获取资源并在析构函数中释放资源.
不要使用auto_ptr,因其复制动作会使得被复制物指向null,应使用shared_ptr(C++11)
条款14
在资源管理类中小心copying行为
shared_ptr等智能指针用在hezp-based资源上,对于不在heap上的资源来说,也许需要构建自己的资源管理class(如mutex);
复制RAII对象必须一并复制它管理的资源,即资源的copying行为决定RAII对象的copying行为,即所谓深度拷贝(deep copying);
常见RAII类的copying行为包括:抑制copying,施行引用计数(如使用shared_ptr指定删除器).
条款15
在资源管理类中提供对原始资源的访问
如shared_ptr提供了get()访问原始资源;
APIs往往要求访问原始资源,所以一个RAII class应该提供一个"取得其所管理之资源"的办法;
可通过显式接口或隐式转换实现上述目标,一般而言显式转换比较安全(class.get()),隐式转换比较方便,但会增加错误的机会(operator class())
条款16
成对使用new和delete时要采取相同形式
规则很简单,new对应delete, new []对应delete []
条款17
以独立的语句将newd对象置入智能指针
这里涉及到了编译器在处理单个语句的各项子操作时顺序并不总是一致的,若在中途出错,可能会引起资源泄露,但对于跨越语句间的各项操作则是固定的;
以独立语句将newd对象置于智能指针中,若不这样做,一旦异常被抛出,有可能引起资源泄露.