上一部分 Effective C++ --2 构造/析构/赋值运算
13、以对象管理资源
(1)为了防止new后提前return等没有执行delete造成内存泄露,利用RAII(resource acquisition is initialization,资源取得时便是初始化时机)对象。
(2)两个常被使用的RAII对象auto_ptr和tr1::shared_ptr。两者都是智能指针,其析构函数自动对其所指对象调用delete。前者有所有权的概念,复制等操作会有所有权的转移;后者支持RCSP(reference-counting smart pointer,引用计数型智能指针),通常是较佳选择,因为其copy比较直观。
14、在资源管理类中小心copying行为
(1)复制RAII对象进行的是深度拷贝,不论指针或是指针所指内存都被复制。
(2)普遍的RAII对象copying行为是:抑制copying、施行引用计数法。前者将copying操作声明为private;后者使用shared_ptr,还可以指定删除器,当引用计数为0时自动调用删除器。
15、在资源管理类中提供对原始资源的访问
(1)APIs往往要求访问原始资源,所以每一个RAII对象都应该提供一个“取得其所管理之资源”的方法。方法有两种:显式和隐式。显示通过get()得到;隐式提供隐式转换函数,将资源返回。
16、成对使用new和delete时采用相同的形式
(1)new 和delete(单个对象),new[] 和delete[](一组对象), 使用形式一致。
(2)不要对数组形式做typedefs动作,容易造成上述规则出错。(对数组做typedefs是为了用到相同类型和大小的数组时方便使用,最好不要这么做。)
17、以独立语句将newed对象置入智能指针
(1)分离语句,将newed对象置于智能指针内,否则一旦抛出异常,可能造成内存泄露。