1

升压文档如下:

笔记

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

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

在我看来,两者pool_allocatorfast_pool_allocator使用相同的机制来分配内存,即从这样的singleton_pool单例中分配内存。但是,此注释未指定用于fast_pool_allocator. 对于上面的这样一个注释,我认为它们的行为相同。我对么?

请帮忙。谢谢。

4

1 回答 1

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()。如果进程无论如何终止,当然池将被释放。

于 2017-01-27T04:32:02.173 回答