使用异常处理的程序能够在异常发生之后令程序流程继续。这种程序需要在异常发生后资源能够被正常回收,一个简单的确保资源被释放的方法是使用智能指针。
- 函数退出有两种可能,第一种是正常执行结束,第二种是发生了异常。这两种情况,局部对象都会被销毁。
- 局部对象被销毁,但是内存如何被释放?当使用智能指针时,对象被销毁时会检查引用计数。如果是指向这块内存的唯一的指针,内存会被释放掉。当使用我们直接管理的内存(new&&delete)时,如果使用内置指针管理内存,且在new之后在对应的delete之前发生了异常,那么内存将不会被释放。
void f(){
shared_ptr<int> sp(new int(42)); //使用new直接初始化一个智能指针
//这段代码抛出一个异常,且在f中未被捕获
//在函数结束时shared_ptr自动释放内存
}
//直接管理内存不会自动释放
void f(){
int *ip = new int(42); //动态分配一个新对象
//这段代码抛出一个异常,且在f中未被捕获
delete ip; //在退出前释放内存
}
上述两段代码如果在异常抛出点异常被捕获,使用智能指针内存会被释放掉,而直接管理(new && delete)的内存不会被释放掉。