Tags:
create new tag
, view all tags

内存管理

内存管理一直是令C++程序员最头疼的工作,C++继承了C那高效而又灵活的指针,使用起来稍微不小心就会导致内存泄漏(memory leak)、“野”指针(wild pointer)、访问越界(access denied)等问题。曾几何时,C++程序员曾经无限地向往Java、C#等语言的垃圾回收机制。虽然C++标准提供了智能指针std::auto_ptr,但并没有解决所有问题。

阅读完本章,你会了解到高效的内存管理方法,彻底忘记“栈”(Stack)、“堆”(Heap)等内存分配相关的术语,并且还会发现,Boost为C++提供的解决方案可能要比Java和C#等其他语言更好。

智能指针

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

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

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

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

auto_ptr很好用,被包含在C++标准库中令它在世界范围内被广泛使用,使智能指针的思想、用法深入人心。但标准库并没有覆盖智能指针的全部领域,尤其是最重要的引用计数型智能指针。

boost.smart_ptr库是对C++98标准的一个绝佳补充。它提供了六种智能指针,包括scoped_ptr、scoped_array、shared_ptr、shared_array,weak_ptr和intrusive_ ptr,从各个方面来增强std::auto_ptr,而且是异常安全的。库中的两个类——shared_ptr和weak_ptr已被收入到C++新标准的TR1库中。

接下来的部分将详细介绍scoped_ptr、scoped_array、shared_ptr和shared_ array,简要介绍另两个组件weak_ptr和intrusive_ptr。它们都是很轻量级的对象,速度与原始指针相差无几,对于所指的类型T也仅有一个很小且很合理的要求:类型T的析构函数不能抛出异常。

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

#include <boost/smart_ptr.hpp>
using namespace boost;

-- CnAngel - 2010.11.02

Topic attachments
I Attachment Action Size Date Who Comment
Compressed Zip archivezip BoostC.zip manage 364.2 K 2010-11-02 - 05:31 CnAngel Boost程序库完全开发指南
Topic revision: r2 - 2011-01-11 - CnAngel
 
This site is powered by the TWiki collaboration platformCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback 京ICP备05049167号