高效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,且安全
原文地址:https://www.cnblogs.com/chusiyong/p/11448516.html