芝士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());
}
- 获取资源后立即移交给资源管理对象
- 资源管理对象使用它们的析构函数确保资源被释放