增强文档如下:
注意
此分配器使用的基础
singleton_pool
构造一个永不释放的池实例。这意味着在main()
完成后仍然可以使用分配器分配的内存,但这可能意味着某些内存检查程序会抱怨泄漏。
我很困惑,因为我检查了代码,singleton_pool
似乎仍然只在当前进程的堆上创建。即如果进程被操作系统杀死,那么这个池会被释放吗?那么上面的注释仅仅意味着一些守护程序线程是否继续,并且这个池在main()之后仍然可用?或者它实际上意味着即使在整个过程被杀死后池也不会被释放?
在我看来,pool_allocator
和fast_pool_allocator
都使用相同的机制来分配内存,即来自这样的singleton_pool
单例。但是,没有为fast_pool_allocator
指定此注释。我认为他们两个在上面这样的说明中表现相同。我是对的吗?
请帮忙。感谢。
答案 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()
之后销毁。如果过程终止,那么游泳池当然会被释放。