3、资源管理

版权声明:本文为博主原创文章,转载请注明出处 http://blog.csdn.net/u013961718 https://blog.csdn.net/u013961718/article/details/88550986

条款13:以对象管理资源

所谓资源,就是一旦使用,将来必须归还到系统。资源包括:内存、文件描述符、互斥锁等。以对象管理资源的核心是:使用RAII(Resource Acquisition Is Initialization)对象,它们在构造函数中获得资源并在析构函数中释放资源。即:

  1. 获得资源后立刻放进管理对象内。
  2. 管理对象运用析构函数确保资源被释放。

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

使用资源管理类对象时要特别注意copying行为,它容易导致程序出现行为异常。因此在实现资源管理类时,有下述处理方式:

  1. 禁止复制。主要用于对lock的管理,若是在copy行为也自动lock,将会导致死锁,因为前一个对象还没有调用unlock。
  2. 对底层资源祭出引用计数法。参考智能指针的实现方式,通过引用对象的引用计数来自动释放对象。
  3. 复制底部资源。简单来说,就是深度拷贝。
  4. 转移底部资源的拥有权。类似于std::auto_ptr,若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的对象将取得资源的唯一拥有权。

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

RAII classes并不是为了封装某物而存在:它们的存在是为了确保一个特殊行为——资源释放——会发生。所以每一个RAII class应该提供一个“取得其所管理资源”的办法,如:

  1. 实现一个类似于get的函数。
  2. 重载*运算符 和->运算符

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

在new表达式中使用[],必须在相应的delete表达式也使用[]。如果在new表达式不使用[],一定不要在相应的delete表达式使用[]。

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

下述函数调用可能会存在内存泄漏问题,原因是两个参数的调用顺序在C++中是不确定的,考虑如下步骤:
(1) 执行 “new Widget”
(2) 调用priority()
(3) 调用tr1:shared_prt()构造函数
若是在步骤(2)抛出异常,则new Widget返回的对象不会放到shared_ptr里面,导致出现泄漏问题。

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

因此,必须以独立语句将newed对象置入智能指针内。

猜你喜欢

转载自blog.csdn.net/u013961718/article/details/88550986