假设我们有这样一个类:
class Investment{...};
然后这个类有一个工厂函数:
Investment * createInvestment();
createInvestment
调用端使用了函数返回的对象后,有责任删除它,
现在有个f函数履行了这个 任务:
void f()
{
Investment * p = createInvestment();
...
delete p;
}
这看起来没问题,但是如果…区域内有一个过早的return语句。如果return发生了,那么delete p
就永远不会执行。此外如果createInvestment
在循环内执行或者delete在循环内,而这个循环由于某个continue或goto语句过早退出。还有一种可能是…区域内抛出了异常,这几种情况都导致delete
被忽略。
为了确保createInvestment
返回的资源总是被释放,我们需要将资源放进对象内,当控制流离开f,该对象的析构函数会自动释放那些资源。
而C++11提供的智能指针正好是针对这种形式而设计的特制产品。
void f()
{
std::unique_ptr<Investment>p(createInvestment());
...
}
这个简单的例子示范了以对象管理资源的两个关键想法:
1.获得资源后立刻放进管理对象.
2.管理对象运用析构函数确保资源被释放.
此外的智能指针还有shared_prt
,它采用了引用计数的做法。持续追踪共有多少对象指向某个资源,在没人指向它的时候自动删除资源。
注意:使用new或new[]分配内存时可以使用unique_ptr
,使用new[]分配内存时,不能使用shared_prt
这里不是为了说明智能指针的用法,而是说明对象管理资源的重要性,想了解更多智能指针的用法可以去百度。
总结:为了防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。
2.常用的RAII类有shared_prt、unique_ptr、weak_ptr,不要使用auto_prt在C++11它已经被废除了。