Effective c++ 读书笔记2

来源:互联网 发布:淘宝红包使用规则 编辑:程序博客网 时间:2024/05/22 13:12

条款13 以对象管理资源

将指向资源的指针放进一个资源管理对象中,这样在资源管理对象析构的时候,资源就能保证被释放。

获得资源后立刻放进管理对象内,以防在期间发生异常,导致资源泄漏。

常用的资源管理对象有std::tr1::shared_ptr(c++11中为std::shared_ptr)和std::auto_ptr。

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

设计一个RAII类(如shared_ptr和auto_ptr)时需要考虑,当一个RAII对象被复制时,会发生什么事情?两种常见选择:

  • 禁止复制
  • 对底层资源使用“引用计数”

同时,还需要考虑是否复制底部资源,即是否深度复制。

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

API往往要求访问原始资源(如指向资源的指针),所以每一个RAII类应该提供一个“取得其所管理资源”的方法。一般有两类方法:

  • 提供一个 显示转换函数,如GetPtr()
  • 使用隐式转换函数
class Smart_Prt{public:    ...    operator A() const    {        return m_pointer;    }    ...private:    ...    A* m_pointer;    ...};

两种方法各有利弊,一般而言显示转换更加安全,而隐式转换对用户比较方便。个人觉得尽量使用显示转换。

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

new和delete,new [] 和 delete [] 要正确配对。

小心typedef把 [] 信息隐藏掉

typedef std::string AddressLines[4];...std::string* pal = new AddressLines;...delete [] pal;

条款17 以独立语句将new出来的对象放进智能指针

考虑如下情况:

int priority();void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);...//现在调用processWidget:processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());

在调用processWidget()之前,需要完成:

  • 执行“new Widget”
  • 调用“tr1::shared_ptr构造函数”
  • 调用“priority“

c++编译器完成上面的三个步骤的顺序弹性很大,调用顺序可以任意组合,只要满足”new Widget”先于”tr1::shared_ptr即可”。

如果priority排在第二位,先执行”new Widget”,再调用priority,执行priority过程中发生异常,那么,获取到的资源还没来得及放进智能指针里,就会造成资源泄漏。

为了避免这种情况发生,应该这样写:

std::tr1::shared_ptr<Widget> pw(new Widget);processWidget(pw, priority());

请用独立语句将new出来的对象放入智能指针内。如果不这样做,一旦异常抛出,有可能导致难以察觉的资源泄漏。

0 0
原创粉丝点击