Дополнительная документация, как показано ниже:
Заметка
Основной
singleton_pool
используемый распределителем this создает экземпляр пула, который никогда не освобождается. Это означает, что память, выделенная распределителем, может все еще использоваться послеmain()
завершена, но может означать, что некоторые программы проверки памяти будут жаловаться на утечки.
Я запутался, так как я проверил код и singleton_pool
По-видимому, все еще создаются только в куче текущего процесса. То есть если процесс будет убит ОС, такой пул будет освобожден в любом случае? Тогда вышеприведенные заметки просто означают, что какой-то поток демонов продолжает работать и такой пул все еще доступен после main ()? Или это на самом деле означает, что пул не будет освобожден даже после полного уничтожения процесса?
Мне тоже кажется pool_allocator
а также fast_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()
, Если процесс все равно будет прерван, пул будет освобожден.
Других решений пока нет …