智能指针和异常

使用异常处理的程序能够在异常发生之后令程序流程继续。这种程序需要在异常发生后资源能够被正常回收,一个简单的确保资源被释放的方法是使用智能指针。

  • 函数退出有两种可能,第一种是正常执行结束,第二种是发生了异常。这两种情况,局部对象都会被销毁。
  • 局部对象被销毁,但是内存如何被释放?当使用智能指针时,对象被销毁时会检查引用计数。如果是指向这块内存的唯一的指针,内存会被释放掉。当使用我们直接管理的内存(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)的内存不会被释放掉。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容