📚
cpp
  • README.md
  • Effective c++
    • 1.让自己习惯c++
    • 2.构造/析构/赋值运算
    • 3.资源管理
    • 4.设计与声明
    • 5.实现
    • 6.继承与面向对象设计
    • 7.模板与泛型编程
    • 8.定制new和delete
  • More effective c++
    • 1.基础议题
    • 2.操作符
    • 3.异常
    • 4.效率
    • 5.技术
    • 6.杂项讨论
  • effective modern c++
    • 1.型别推导
    • 2.auto
    • 3.转向现代c++
    • 4.智能指针
    • 5.右值引用,移动语义和完美转发
    • 6.lambda表达式
    • 7.并发API
    • 8.微调
  • stl源码剖析
  • cpp-concurrency-in-action
Powered by GitBook
On this page
  • 条款13:以对象管理资源
  • 条款14:在资源管理类中小心copy行为
  • 条款15:在资源管理类中提供对原始资源的访问
  • 条款16:成对使用new和delete时要采取相同的形式
  • 条款17:以独立语句将newed对象置入智能指针

Was this helpful?

  1. Effective c++

3.资源管理

条款13:以对象管理资源

RAII,用类来管理资源,将得到的资源放入类中,调用析构函数的时候销毁数据,避免了手动释放

c++中常被使用的RAII class是share_ptr和auto_ptr,也就是智能指针

条款14:在资源管理类中小心copy行为

复制RAII对象一定要一并复制它所管理的资源,所以资源的行为决定RAII对象的copy行为。

RAII class 的copy行为有很多种:

  • 抑制copying,不允许复制

  • 施行引用计数法,类似的有share_ptr

  • 直接转移资源,类似auto_ptr

  • 自己定义其他的也行,但是一定要保证不能二次释放资源

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

APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个获得其原始资源的方法。获得方法有显式转换也有隐式转换

  • 显示转换比较安全,调用get办法得到原始资源

  • 隐式转换容易出错,但是对客户比较方便。

class Font{
public:
    ...
    FontHandle get() const {return f;} //显式转换
    operator FontHandle() const{    //隐式转换
        return f;
    }
    ...
};

条款16:成对使用new和delete时要采取相同的形式

这个条款意思就是 new和delete匹配 new []要和delete []匹配

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

这个条款在于防止new的指针没有放入智能指针块中被管理

Previous2.构造/析构/赋值运算Next4.设计与声明

Last updated 5 years ago

Was this helpful?