[内存管理]智能指针与内存池的总结

原创 2012年03月21日 18:16:53

总结:

内存管理是C++程序开发中永恒的话题,因为没有垃圾回收机制,小心谨慎地管理内存等系统资源是每一个C++开发人员都必须面对面的问题。

boost.smart_ptr库提供了数种新型智能指针,弥补了std::auto_ptr的不足,可以有效地消除new和delete的显示使用,减少甚至杜绝代码资源泄漏。

scoped_ptr是smart_ptr库中最容易学习和使用的一个,它的行为与auto_ptr相似,但所有权明确,清晰地表明了这种智能指针只能在声明的作用域中使用,不能转让,任何对它的复制操作都会失败。这个特点地代码的后期维护工作非常有用。

 shared_ptr可能是最有用的智能指针,也是这些智能指针中最“智能”的一个,不仅能管理内存,还可以管理其他系统资源,能够应用于许多场合。它可以自动地计算指针的引用计数,其行为最接近原始指针。几乎可以在任何可以使用原始指针的地方使用shared_ptr,并且不用承担资源泄漏的风险。shared_ptr不仅可以保存指针,通过配置删除器也可以自动释放指针关联的资源。

除了基本的用法之外,还应该了解pimpl惯用法、应用于工厂模式。持有任意对象的指针等,这些用法进一步展示了它的强大功能。为了方便shared_ptr的使用,smart_ptr库还提供了工厂函数make)shared(),进一步消除了代码中new操作符的使用。

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

weak_ptr能够“静态”地观察shared_ptr而不影响引用计数。

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

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

版权声明:转载时请标注来自于"AJIOY的专栏"

C++内存池(memory pool)管理

程序员在使用C++中的动态内存分配器时,new/delete, malloc/free等操作时,可能会出现以下问题: Memory Leak:new一块空间,但中间抛出错误,最后没有释放成功,导致...
  • yyf_it
  • yyf_it
  • 2016年08月28日 10:23
  • 575

CUDA与内存池(三):引用计数的智能指针

智能指针与引用计数 上一篇博客里,将内存池返回的索引包装成了一个指针类,以方便使用。这里介绍一下如何构造一个智能指针,以便更方便地使用。 智能指针使用引用计数进行内存管理。每个对象都记录自己被多少...
  • jiandingzhe
  • jiandingzhe
  • 2012年09月03日 21:29
  • 802

链表的替代品—内存池

链表是大家非常熟悉的数据结构,使用频率也非常高,但是链表有几个缺点。首先,我们每创建一个节点,都要进行一下系统调用分配一块空间,这会浪费一点时间;其次,由于创建节点的时间不固定,会导致节点分配的空间不...
  • yutianzuijin
  • yutianzuijin
  • 2016年11月27日 19:06
  • 1372

C++内存池

c++内存池 内存管理是 C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管...
  • xujiali5172923
  • xujiali5172923
  • 2015年04月04日 14:54
  • 380

C/C++内存管理之内存池

C++内存管理一直是我比较困惑的问题。俗话说初生牛犊不怕虎,做点啥都new一个,然后delete一个。根本不知道底层会有怎么样的运行机制,慢慢地学习才知道以前学习中有一些东西是不可能在工业中应用的。所...
  • bateerBATEER
  • bateerBATEER
  • 2017年03月28日 21:38
  • 313

一个C++的内存池和内存管理的实现(五)

前面我们实现的这个内存池使用起来,可能会遇到不少问题
  • qiyao_2000
  • qiyao_2000
  • 2015年04月18日 15:06
  • 428

基于C语言的内存池的设计与实现

介绍:     设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,从而减少系统中出现有效空间足够,而无法分配大...
  • xikangsoon
  • xikangsoon
  • 2016年10月08日 19:27
  • 1023

c++内存池实现

利用C/C++开发大型应用程序中,内存的管理与分配是一个需要认真考虑的部分。 本文描述了内存池设计原理并给出内存池的实现代码,代码支持Windows和Linux,多线程安全。 内存池设计过程中需要...
  • neustar1
  • neustar1
  • 2012年04月19日 17:12
  • 14296

Glib内存管理模块之magazine layer

Glib中使用了slab进行内存管理,同时引入了magazine cache来进行多级缓存。本文主要介绍magazine cache部分实现。...
  • MeRcy_PM
  • MeRcy_PM
  • 2016年12月01日 15:09
  • 559

一个C++的内存池和内存管理的实现(一)

用C++编写高效稳定的软件,有效的内存管理通常是绕不开的一个题目,尤其是对于复杂庞大的商业软件。...
  • qiyao_2000
  • qiyao_2000
  • 2015年04月17日 18:11
  • 1054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[内存管理]智能指针与内存池的总结
举报原因:
原因补充:

(最多只允许输入30个字)