读书笔记 Effective C++: 03 资源管理

条款13:以对象管理资源

1. 为防止资源泄露,使用RAII对象。在构造函数中获得资源,在析构函数中释放资源。

2. 常常需要在RAII classes中使用boost::shared_ptr,使copy行为比较直观。

 

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

1. 复制RAII对象必须一并复制其所管理的资源。

2. RAII class copying行为是:禁止复制,shared_ptr, 深拷贝,转移资源的拥有权。

 

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

1. APIs往往要求访问原始资源。对原始资源的访问可能经由显示转换或隐式转换,显示转换比较安全,隐式转换对客户比较方便。

显示转换,通过get()函数获取裸指针:

  boost::shared_ptr<Investment> pi(new Investment);

  Investment* p = pi.get();

隐式转换,隐式转换与操作符重载不一样:

  class Font{

  public:

    operator FontResouce*() const{

      return p;

    }

    FontResouce* get() const{

      return p;

    }

    

  private:

    FontResouce* p;

  };

 

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

  new和delete配对,new[]和delete[]配对。

 

条款17:以独立语句将new出来的对象置入智能指针

  函数接口:

  void processWidget(boost::shared_ptr<Widget> pw, int priority);

  调用方式:

  boost::shared_ptr<Widget> pw(new Widget);

  processWidget(pw, priority());

  而不要用以下方式:

  processWidget(boost::shared_ptr<Widget>(new Widget), priority());

这是因为:调用之前编译器必须创建代码,完成以下三件事:1. 调用priority(); 2. 执行new Widget; 3. 调用boost::shared_ptr<Widget>构造函数;编译器对一条语句用重新排列的自由,但是对跨越语句的操作却没有重新排列的自由。因此,C++编译器可能会123,213,231的次序完成上述的3件事,编译器只保证次序23,但是何时执行1,就看编译器的优化了。如果执行的次序是213,但是在执行1的过程抛出异常,导致过程3没有执行,就可能引发资源泄露。

posted on 2013-04-11 23:42  LeaGem  阅读(154)  评论(0)    收藏  举报