Boost开发指南-3.12小结

内存管理是c++程序开发中永恒的话题,因为没有垃圾回收机制,小心谨慎地管理内存等系统资源是每一个C++程序员都必须面对的问题。C++11标准提供了unique_ptr、shared_ptr 和 weak_ptr,很好地减轻了程序员的内存管理负担,但没有解决所有问题,讨论了Boost关于内存管理的两个库:smart_ptr和 pool。

boost.smart_ptr库提供了数种新型智能指针,非常接近C++11标准的定义,可以有效地消除new和l delete的显式使用,减少甚至杜绝代码资源泄漏。
scoped_ptr 是 smart_ptr 库中最容易学习和使用的一个,它的行为类似unique_ptr,但所有权更明确,清晰地表明了这种智能指针只能在声明的作用域中使用,不能转让,任何对它的复制企图都会失败。这个特点对代码的后期维护工作非常有用。

shared_ptr 可能是最有用的智能指针,也是这些智能指针中最“智能”的一个,不仅可以管理内存,也可以管理其他系统资源,能够应用于许多场合。它可以自动地计算指针的引用计数,其行为最接近原始指针。几乎可以在任何可以使用原始指针的地方使用shared_ptr,并且不用承担资源泄漏的风险。shared _ptr不仅可以保存指针,通过配置删除器也可以自动释放指针关联的资源。在基本的用法之外,我们还讨论了shared_ptr的很多其他用法,如实现pimpl惯用法、应用于工厂模式、别名构造、持有任意对象的指针等,这些用法进一步展示了它的强大功能。

为了方便智能指针的使用,smart_ptr库还提供了工厂函数make_unique()和make_shared(),进一步消除了代码中new操作符的使用。

scoped_array/shared_array是 scoped_ptr/shared_ptr对动态数组的扩展,它们为动态数组提供了可自动删除的代理,shared_array 比 scoped_array有更多的用途。但我们更应该使用vector和shared_ptr<vector>,除非程序对性能有非常苛刻的要求。

还简要讨论了smart_ptr 的另两个组:weak_ptr 是一个弱引用,能够“静态”地观察shared ptr而不影响引用计数,intrusive_ptr则为自行实现引用计数智能指针提供了通用技术方案。

pool库是 Boost 程序库在内存管理方面提供的另一个有用工具,它实现了高效的内存池,用于管理内存资源。pool库提供了pool、object_pool、singleton_pool和pool_alloc 四种形式的内存池,适合于各种情形的应用。可以完全把它们当做是一个小型的垃圾回收机制,在内存池中随意地动态创建对象,而完全不用关心它的回收,也无需对原有类做任何形式的修改。

pool库的四个内存池类中前三个都很有用,尤其是 object_pool,它可以统一地管理各种对象的创建与销毁,能够很好地应用在各种规模的面向对象软件系统中。至于pool_alloc,它是符合C++标准的一个内存分配器实现,快速且高效,但通常标准库自带的内存分配器会更好地与容器配合工作,使用pool_alloc时需要仔细地评估可能带来的影响。

pool库还提供一个底层的实现类simple_segregated_storage,它实现了简单分隔存储的管理机制,是pool库其他类的基础。它不适合大多数库用户,但可以作为自行实现内存池类的一个很好的起点。

猜你喜欢

转载自blog.csdn.net/qq_36314864/article/details/132067725