Item13:使用对象管理资源

芝士wa
2024.4.1 愚人节快乐
Item13参考链接


引例:
假设我们和一个模拟投资的库一起工作,各种各样的投资形式从一个root class中继承出来:

class Investment{...};//root class 

进一步,假设这个库为我们提供特定对象的方法是通过一个工厂函数达成的,

Investment* createInvestment();//return ptr to dynamically allocated object in the Investment hierarchy;

当createInvestment函数返回的对象不再使用时,由createInvestment的调用者负责删除它,考虑写一个函数f来履行这个职责:

void f()
{
  Investment *pInv = createInvestment();
  ...
  delete pInv;
}

这种写法看上去没什么问题,但是如果在delete之前有return语句或goto语句,或者抛出了异常,那么控制流程不会到达delete,会导致内存泄漏。

为了确保createInvestment返回的资源总能被释放,我们需要将那些资源放入一个对象中,这个对象的析构函数在控制流程离开f的时候会自动释放资源。

书中提到了采用智能指针管理资源的释放,并使用了auto_ptr,但是从C++11开始,auto_ptr被弃用,被弃用的原因大概是auto_ptr采用copy语义来转移指针资源,转移指针资源的所有权的同时将原指针置为NULL,会导致原指针指向空,无法使用。C++11使用std::unique_ptr取代了auto_ptr。

void f()
{
  std::unique_ptr<Investment> pInv(createInvestment());
}
  • 获取资源后立即移交给资源管理对象
  • 资源管理对象使用它们的析构函数确保资源被释放
posted @ 2024-04-01 15:30  芝士wa  阅读(23)  评论(0)    收藏  举报