• 《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出来的对象存入智能指针。如果没有这样做(比如直接作实参),一旦

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

  • 相关阅读:
    问题引入:多个线程读写同一共享变量是否存在并发问题?
    【数据聚类】基于粒子群、遗传和差分算法实现数据聚类附matlab代码
    设计提效-Figma技巧篇
    Kotlin学习笔记之泛型和委托
    学会提问,ChatGPT可以帮你写出高质量论文
    微软不再允许Windows 11通过1@1.com绕过登录 但还有其他办法可以继续用
    CentOs7搭建基于pptp的VPN服务器
    美团一面(手撕)
    NoSQL数据库之MongoDB
    ​中秋团圆季《乡村振兴战略下传统村落文化旅游设计》许少辉八月新书
  • 原文地址:https://blog.csdn.net/myepicure/article/details/133993589