C++箴言:使用对象管理资源

C++箴言:使用对象管理资源,第1张

C++箴言:使用对象管理资源,第2张

假设我们从事一项投资(如股票、债券等)。)模型库,而各种投资形式都是从一个根类投资中派生出来的:

类别投资{...};//投资类型层次结构的根类
//投资类型

让我们进一步假设这个库使用的方法是通过一个工厂函数为我们提供一个特定的投资对象:

investment * create investment();//将ptr返回给投资层次结构中动态分配的
//对象;
//调用方必须删除它
//(为简单起见,省略参数)

注意,当createInvestment函数返回的对象不再使用时,createInvestment的调用者负责将其删除。那么,请考虑一下,写一个函数f来执行下面的职责:

void f()
{
Investment * pInv = create Investment();//调用工厂函数
...//使用pInv
删除pInv;//释放对象
}

这看起来很好,但是有几种情况会导致F无法删除它从createInvestment获得的投资对象。有可能在“...”中的某个地方有一个提前返回语句这个功能的一部分。如果执行了这样的返回,控制流就不能再到达delete语句。如果createInvestment的使用和删除在一个循环中,并且该循环通过continue或goto语句提前退出,也会出现类似的情况。还有,“…”中的一些语句可能会引发异常。如果是这样,控制流将不会再次到达该删除。无论如何跳过删除,我们不仅会泄漏保存投资对象的内存,还会泄漏该对象保存的任何资源。

当然,精心编程可以防止各种错误,但要考虑到这些代码可能会随时间而变化。为了维护软件,有些人可能会在没有完全掌握该功能对资源管理策略其他部分的影响的情况下,添加return或continue语句。更何况,这个“……”F的一部分可能调用了一个从来不习惯抛出异常的函数,但是在“改进”之后突然这么做了。依赖于F总是到达它的delete语句是不可靠的。

为了确保createInvestment返回的资源总是可以被释放,我们需要将这些资源放入一个类中。这个类的析构函数会在控制流离开f时自动释放资源,其实这只是本文介绍的概念的一半:通过将资源放在一个对象内部,我们可以依靠C++自动调用析构函数来保证资源被释放。(后面我们还会介绍这篇文章的另一半概念。)

许多资源被动态分配给堆并在单个块或函数中使用,当控制流离开该块或函数时,应该释放这些资源。库的标准auto_ptr就是针对这种情况定制的。Auto_ptr是一个类似指针的对象(智能指针),它的析构函数会自动调用它所指向的delete。下面是如何使用auto_ptr来防止F的潜在资源泄漏:

void f()
{
STD::auto _ ptr pInv(create investment());//调用工厂
//函数
...//使用pInv作为
// before
} //自动
//通过
// auto_ptr的dtor
删除pInv

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++箴言:使用对象管理资源

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情