Boost开发指南-3.1smart_ptr

RAII机制

为了管理内存等资源,c++程序员通常采用RAII机制(资源获取即初始化,ResourceAcquisition Is Initialization),在使用资源的类的构造函数中申请资源,然后使用,最终在析构函数中释放资源。

如果对象是用声明的方式在栈上创建的(一个局部对象),那么RAI工机制会工作正常,当离开作用域时对象会自动销毁从而调用析构函数释放资源。但如果对象是用new操作符在堆上创建的,那么它的析构函数不会自动调用,程序员必须明确地用对应的delete操作符销毁它才能释放资源。这就存在着资源泄漏的隐患,因为这时没有任何对象对已经获取的资源负责,如果因某些意外导致程序未能执行delete语句,那么内存等资源就永久地丢失了。例如:

auto p = new class_need_resource; //对象创建,获取资源
... //可能发送异常导致资源泄露
delete p; //析构释放资源

new、 delete 以及指针的不恰当运用是C++中造成资源获取/释放问题的根源,能否正确而明智地运用delete是区分C++新手与熟手的关键所在。但很多人——即使是熟练的C++程序员,也经常会忘记调用delete。

智能指针

智能指针(smart pointer)是C++群体中热门的议题,围绕它有很多有价值的讨论和结论。它实践了代理模式,代理了原始“裸”指针的行为,为它添加了更多更有用的特性。

C++引入异常机制后,智能指针由一种技巧升级为一种非常重要的技术,因为如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码以释放资源,而智能指针则可以在退出作用域时——不管是正常流程离开或是因异常离开——总调用delete来析构在堆上动态分配的对象。

存在很多种智能指针,其中最有名的应该是 C++98标准中的“自动指针”std::auto_ptr,它部分地解决了获取资源自动释放的问题,例如:

int main()
{
     auto_ptr<class_need_resource> p1(new class_need_resouce);
     auto_ptr<demo_class> p2(factory.create());
     ...
} //离开作用域,p1、p2自动析构从而释放内存等资源

auto_ptr的构造函数接受new操作符或者对象工厂创建出的对象指针作为参数,从而代理了原始指针。虽然它是一个对象,但因为重载了operator*opreator->,其行为非常类似指针,可以把它用在大多数普通指针可用的地方。当退出作用域时(离开函数main或者发生异常),C++语言会保证auto_ptr对象销毁,调用auto_ptr的析构函数,进而使用delete操作符删除原始指针释放资源。

auto_ptr很好用,被包含在C++98标准库中令它在世界范围内被广泛使用,使智能指针的思想、用法深入人心。但auto_ptr存在一些缺陷,所以C++11/14标准提供了更完善的unique_ptr、shared_ptr 和 weak_ptr,而它们正是基于我们接下来要介绍的boost.smart_ptr库。

boost.smart_ptr库提供了六种智能指针,包括 scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr 和 intrusive_ptr。它们是轻量级的对象,速度与原始指针相差无几,都是异常安全的(exception safe),而且对于所指向的类型T也仅有一个很小且很合理的要求:类型T的析构函数不能抛出异常。

这些智能指针都位于名字空间boost,为了使用smart_ptr 组件,需要包含头文件,即:

#include 
using namespace boost;

你可能感兴趣的:(Boost,java,开发语言)