• 高效C++:资源管理


      C++中资源泄漏一直都是老大难的问题,特别是在嵌入式环境中,一点点的资源泄漏,加上长时间的运行们就会导致程序崩溃,这种问题定位非常困难,无规律偶发。解决问题的一种方式是使用特定工具检查内存泄漏,优点是简单,可以直接找出泄漏的函数,缺点是复现,时间长,不同工具的使用方式不同,不统一,在私有平台和编译器上可能无法使用。另一种解决方式是在开发时就对所有的资源进行管理,从根本上解决资源泄漏的问题,本章主要说明资源管理的方法。

    以对象管理资源

    • 提供专门的类对某一资源进行管理,不在手动的对资源进行释放

    • 方法:在资源管理类的析构函数中对管理的资源进行释放,当管理类被析构时,会自动释放资源

    • 难点:

      • 同一资源被多个管理类管理

      • 多线程中,资源死锁的问题

      • 常用的资源管理类:auto_ptr share_ptr

    • https://www.cnblogs.com/chusiyong/p/11295230.html

    std::auto_ptr<Investment> p(creatInvestment());

    在资源管理类中小心copy行为

    • 原因:防止同一资源被多个管理类管理,从而导致多次释放的问题

    • 方法:

      • 进行深拷贝

      • 抑制管理类的拷贝动作

      • 使用应用计数(注意死锁问题)

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

    • 资源管理类需要提供访问原始资源的方法,可以是显示的也可以是隐式的

    • 一般而言显示的获取资源比隐式的安全,建议使用显示方式

    • 优点:使用资源管理类和使用普通指针的方法相同,具备一致性

    • 方法:重载->操作符

    成对的使用new和delete

    • delete和new成对使用

    • delete [] 和 new[]成对使用

    • new会调用构造函数,delete会调用析构函数

    • free和malloc成对使用

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

    int f1()
    void f2(std::tr1::shared_ptr<Widget> pw, int x)
        
    f2(new Widget, f1())  //错误,tr1::shared_ptr需要一个原始指针,且构造函数是explict,无法隐式转换
        
    f2(std::tr1::shared_ptr<Widget>(new Widget), f1()) //ok,但不安全
    // 1.执行new Widget 2.调用shared_ptr<Widget>构造函数 3.调用f1() 但是三者顺序不确定(1一定在2之前)
        
    std::tr1::shared_ptr<Widget> pw(new Widget)
    f2(pw, f1()) //ok,且安全
  • 相关阅读:
    el-select 和 el-checkbox
    element-ui : <el-table> 按钮点击操作阻止@row-click
    vue 点击按钮几种总结
    div内元素右对齐 && 文字对齐
    父元素高度为 0, 导致元素错位
    从后端传过来的数据,明明是换行,却都替换成空格了。
    Spoken English
    C++ ofstream和ifstream
    C++ 文件操作实例
    matlab
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11448516.html
Copyright © 2020-2023  润新知