阅读数:641
条款13:为防止资源泄漏,请使用RAII对象,它们在构造函数中,获得资源并在析构函数中释放资源。 两个常被使用的RAII对象分别是shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它指向null。
条款14:在资源管理类中,小心copying行为。 复制RSII对象必须一并复制他所管理的资源,所以资源的copying行为决定RAII对象的copying行为。 普遍而常见RAII class copying行为是:抑制copying,引用计数法(类似shared_ptr),深度复制,转移资源拥有权(类似auto_ptr)。 另外,shared_ptr还可以指定所谓的“删除器”,比如在引用计数为0时,不是删除指针,而是解除锁定。
条款15:在资源管理类中,提供对原始资源的访问。 这是因为,有些API函数需要直接处理资源(指针),比如shared_ptr提供了get()方法,用以返回其保存的资源。
APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理资源”的方法。 对原始资源的访问可能经由显式转换或隐式转换。一般而言,显式转换比较安全,但隐式转换对客户比较方便。
条款16:成对使用new和delete时,要采用相同形式。
比如,new对应delete,new []对应delete []。 对于数组类型,一般不要使用typedef。
同样的道理,在C语言中,多级指针的使用时,用了多少次malloc,就要用多少次free。
条款17:以独立语句将newed对象置入智能指针。
C++对于函数参数的执行次数没有定义,所以呢,在调用函数的时候,在参数上使用new构造函数,一旦发生异常,可能会导致内存泄露。最好,在单独的语句中new出对象,再放入参数中。
|