《Effective C++》知识点(3)--资源管理

13. 以对象管理资源

    13.1 使用原始指针(raw pointer),很容易造成资源泄漏,因为:

            a. 忘记写delete语句

            b. 在到达delete语句前,函数已经过早return

            c. 在到达delete语句前,发生了抛出异常,而导致函数退出

    13.2 把资源放进对象RAII(Resource Acquisition Is Initialization)

            a. 获得资源后立刻放进管理对象(调构造函数)

            b. 管理对象依赖析构函数确保资源被释放

    13.3 两个常使用的RAII类

            std::auto_ptr不能多个指向同一对象,复制动作(拷贝构造或赋值)会使被复制ptr指向null。 

            std::tr1::shared_ptr应优先选择,它是引用计数智能指针(RCSP),可以多个指向同一对

            象。缺点是无法打破环状引用(如两个没用的对象彼此互指),这点需要注意。

           两者在析构时调用的是delete,而不是delete[]。如果用到数组,可以使用

           boost::scoped_array和boost::shared_array。

14. 在资源管理类中小心copying行为

      14.1 RAII对象的copying行为由资源的copying行为决定

      14.2 常见的RAII类的copying行为:

             a. 禁止复制,参考条款6。

             b. 对底层资源使用"引用计数法"  

             c. 复制底层资源(深度拷贝)

             d. 转变底层资源的拥有权,确保只有一个RAII对象指向资源,如auto_ptr

15. 在资源管理类中提供对原始资源的访问

     15.1 客户往往要求访问原始资源,所以每个RAII类应该提供“取得其所管理之资源”的办法。

     15.2 对原始资源的访问可以经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式

             换对客户比较方便(增加了错误发生机会)。提供哪种转换取决于RAII类被设计执行的特定                 工作,以及它被使用的情况。 

16. 成对使用new和delete时要采取相同形式

      16.1 如果在new表达式中使用[],必须在相应的delete表达式中也使用[],否则内存泄漏。

      16.2  如果在new表达式中没有使用[],一定不要在相应的delete中使用[],否则可能删除不属于它的内存,造成不可预测的结果

      16.3 不要对数组形式做typedef动作(可能忘记用delete[]),使用标准库vector。 

17. 以独立语句将newed对象置入智能指针

       用单独的一条语句将new出来的对象存入智能指针。如果没有这样做(比如直接作实参),一旦

       中间有异常被抛出,有可能导致难于察觉的资源泄漏。

你可能感兴趣的:(C++,c++)