boost::singleton_pool 是可以在多线程环境下使用的内存池,其malloc/free性能还不错。但是,如果其ordered_malloc/ordered_free在频繁的使用,会产生内存碎片,从而导致申请不到合适的内存。因此建议谨慎使用。

解决方案 »

  1.   

    谢谢LZ。
    还没有使用过boost。
      

  2.   


    同上,还没有使用过boost库
      

  3.   

    boost的pool的长处是固定长度的内存管理,如果是非定长的话,他的算法不是最优。
    另外,他还有一个优点,就是类似java一样,你可以只管申请,不用释放,在析构里面他会自动给全部释放掉。因此,如果程序不是长时间频繁的进行非定长内存分配和释放,那么boost的pool是个不错的选择。还有一个内存池nedmalloc很不错,很值得推荐。我最近一段时间来一直在学习tcmalloc和nedmalloc,还有boost的pool。最终,我还是选择nedmalloc。
      

  4.   

    用定长是可以有效避免内存碎片。以前自己也做过内存管理,处理网络数据包,每个数据包是一个类,
    然后有一个回收队列,开辟过的数据放到回收队列,可再利用。这样简单的设计也能抗不久,不知道boost效果怎么样,
    你们的服务器是什么机子?内存很小吗? 多久导致出现这个现象。 内存碎片只有在跑7*24下&&程序内存占用高,导致。LZ出现这个问题也可以考虑下内存总量把关上。
      

  5.   

    用定长的是肯定没有问题。我采取的是非定长的模式。大概坚持了5-6个小时后,再找不到合适大小的内存了,因为内存池里面的内存都是碎片。后来就采用最基本的new/delete反而一点问题没有。如果要采用非定长的模式,我个人还是推荐采用tcmalloc或者nedmalloc。效果非常明星。
      

  6.   

    boost::singleton_pool 真是让人失望。仔细看了他的代码,居然有一次性的内存泄漏。虽然无关紧要,但是还是感觉不舒服。
    他在构造里面创建了池,退出时居然不析构掉。唉....vc就会报内存泄漏。
      

  7.   

    我用的版本是 boost 1.48
      

  8.   

    没用过,但是对boost很期望。