gpt4 book ai didi

c++ - boost pool_allocator 内存池行为说明

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:38 27 4
gpt4 key购买 nike

boost文档如下:

Note

The underlying singleton_pool used by the this allocator constructs a pool instance that is never freed. This means that memory allocated by the allocator can be still used after main() has completed, but may mean that some memory checking programs will complain about leaks.

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

在我看来,pool_allocatorfast_pool_allocator 都使用相同的机制来分配内存,即来自这样的 singleton_pool 单例。但是,此注释并未针对 fast_pool_allocator 指定。对于上面的注释,我认为它们的行为相同。我说得对吗?

请帮忙。谢谢。

最佳答案

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

关于c++ - boost pool_allocator 内存池行为说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33164356/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com