Effective C++ 第三章:资源管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/budding0828/article/details/86624891

第三章:资源管理

条款13:以对象管理资源

把资源放进对象内,我们便可以依赖C++的“析构函数自动调用机制”确保资源被释放。

void f()
{
    std::auto_ptr<Investment> pInv(createInvestment());
	//调用factory函数,经由auto_ptr的析构函数自动删除pInv
}
  • 获得资源后立刻放进管理对象
    每一笔资源都在获得的同时立刻被放进管理对象中。

  • 管理对象运用析构函数确保资源被释放
    不论控制流如何离开区块,一旦对象被销毁,其析构函数自然会被自动调用,于是资源被释放。

  • auto_prt是个“类指针对象”,也就是“智能指针”。受auto_ptr管理的资源只能有一个指针指向它。

  • 替代auto_ptr的指针是:引用计数型智慧指针,如TR1的tr1::shared_ptr。能够持续追踪共有多少对象指向某笔资源,并在无人指向它的时候自动删除该资源。

void f()
{
   ...
   std::tr1::shared_ptr<Investment> pInv1(createInvestment());
   std::tr1::shared_ptr<Investment> pInv1(pInv2); //pInv1和pInv2同时指向一个对象
}//pInv1和pInv2被销毁,其所指的对象也被销毁
  • auto_ptr和tr1::shared_ptr都是在析构函数中做delete而不是delete[]动作。所以不能用于管理数组型资源。
std::auto_ptr<string> aps(new std::string[10]); //是错误的

可以使用boost::scoped_array和boost::shared_array class替代。

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

  • 禁止复制:可以通过继承Uncopyable来实现

  • 引用计数:如使用std::tr1::shared_ptr。内置有一个删除器。

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

  • tr1::shared_ptr和auto_ptr都提供一个get成员函数,用来执行显示转换,也就是会返回智能指针内部的原始指针(的复件)
tr1::shared_ptr<Investment> pInv(createInvestment());
Investment* hold = pInv.get();

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

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

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

  • C++不以特定次序完成函数参数的核算
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
//可能先执行new Widget,也可能先执行priority()
  • 解决办法:分离可能会产生冲突的参数
std::tr1::shared_ptr<Widget> pw(new Widget);  //在单独语句内以智能指针储存newed所得对象

猜你喜欢

转载自blog.csdn.net/budding0828/article/details/86624891
今日推荐