您的位置:首页 > 编程语言 > C语言/C++

精通C++资源管理-以对象管理资源

2016-07-14 17:03 337 查看
1. 以对象管理资源

我们一起来看下面一段代码,

void f()

{

Investment* pInv = createInvestment();//调用factory函数

...

delete pInv;//释放pInv所指对象

pInv = NULL;

}

上面的代码看起来,似乎没有啥问题,由factory函数动态分配了一个Investment对象,在调用函数f返回之前将它释放。但不难发现,在若干情况下f可能无法删除pInv。在"..."区域,谁能确保代码会与你所预期的那样运行。是的,这区域里可能会出现过早的return,或者出现异常等等。因此单纯依赖“f总是会执行其delete语句”是行不通的。

在effective c++中条款13,就提出将资源放进对象内。当控制流离开f,该对象的析构函数会自动释放那些资源。也即该条款中的半边想法:把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放。

a. 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。如,

void f()

{

auto_ptr<Investment> pInv(createInvestment());

}

void f()

{

shared_ptr<Investment> pInv(createInvestment());

}

上面的代码示范“以对象管理资源”的两个关键想法:

1). 获得资源后立刻放进管理对象

2). 管理对运用析构函数确保资源被释放。(可以思考一下这个问题,即如果资源释放运作可能导致抛出异常,这时候如何解决资源释放)

b.两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr。前者通常是较佳的选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null.

注:待分析问题, auto_ptr和shared_ptr的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: