boost pool_allocator内存池行为澄清

时间:2015-10-16 07:01:37

标签: c++ boost boost-pool

增强文档如下:

  

注意

     

此分配器使用的基础singleton_pool构造一个永不释放的池实例。这意味着在main()完成后仍然可以使用分配器分配的内存,但这可能意味着某些内存检查程序会抱怨泄漏。

我很困惑,因为我检查了代码,singleton_pool似乎仍然只在当前进程的堆上创建。即如果进程被操作系统杀死,那么这个池会被释放吗?那么上面的注释仅仅意味着一些守护程序线程是否继续,并且这个池在main()之后仍然可用?或者它实际上意味着即使在整个过程被杀死后池也不会被释放?

在我看来,pool_allocatorfast_pool_allocator都使用相同的机制来分配内存,即来自这样的singleton_pool单例。但是,没有为fast_pool_allocator指定此注释。我认为他们两个在上面这样的说明中表现相同。我是对的吗?

请帮忙。感谢。

1 个答案:

答案 0 :(得分:0)

singleton_pool使用非局部静态变量的初始化功能实现线程安全(在某些情况下)没有锁的单例。源代码的一部分:

template <typename Tag,
    unsigned RequestedSize,
    typename UserAllocator,
    typename Mutex,
    unsigned NextSize,
    unsigned MaxSize >
class singleton_pool
{
   ...
   struct object_creator
   {
      object_creator()
      {  // This constructor does nothing more than ensure that instance()
         //  is called before main() begins, thus creating the static
         //  T object before multithreading race issues can come up.
         singleton_pool<Tag, RequestedSize, UserAllocator, Mutex, NextSize, MaxSize>::get_pool();
      }
      inline void do_nothing() const
      {
      }
   };
   static object_creator create_object;
}; // struct singleton_pool

非局部变量在程序启动过程中初始化,在主函数执行开始之前,在程序终止时被拆除。因此singleton_pool将在main()之前创建,并在main()之后销毁。如果过程终止,那么游泳池当然会被释放。