Boost简单学习:2 智能指针概述

1940 人浏览 | 时间: 2015-11-13 21:18:05 | 作者: 烫烫烫烫烫烫烫烫
    1998年修订的第一版C++标准只提供了一种智能指针:std::auto_ptr,它基本上就像是个普通的指针:通过地址来访问一个动态分配的 对象。std::auto_ptr之所以被看作是智能指针,是因为它会在析构的时候调用delete操作符来自动释放所包含的对象。当然这要求在初始化的 时候,传给它一个由new操作符返回的对象的地址。既然std::auto_ptr的析构函数会调用delete操作符,它所包含的对象的内存会确保释放 掉。这是智能指针的一个优点。

    当尝试和异常联系起来时这就更加重要了:没有std::auto_ptr这样的智能指针,每一个动态分配内存的函数都需要捕捉所有可能的异常,以确保在异常传递给函数的调用者之前将内存释放掉。Boost C++ 库的智能指针系列提供了许多可以用在各种场合的智能指针。

    先介绍下一个专业词汇:RAII(Resource Application Immediately Initialize)资源申请即初始化。这也是智能指针的基本原理,智能指针只是这个习语的其中一例。智能指针确保在任何情况下,动态分配的内存都能得 到正确释放,从而将开发人员从这项任务中解放了出来。 这包括程序因为异常而中断,原本用于释放内存的代码被跳过的场景。用一个动态分配的对象的地址来初始化智能指针,在析构的时候释放内存,就确保了这一点。 因为析构函数总是会被执行的,这样所包含的内存也将总是会被释放。

    无论何时,一定得有第二条指令来释放之前另一条指令所分配的资源时,RAII 都是适用的。许多的 C++ 应用程序都需要动态管理内存,因而智能指针是一种很重要的 RAII 类型。不过 RAII 本身是适用于许多其它场景的。

相关阅读