Como o boost.pool consegue reutilizar a memória alocada?
fundo
Minhaspergunta anterior sobreboost.pool
me levou a investigar boost.pool em detalhes, e agora eu tenho uma pergunta complementar para finalizar meu entendimento.
Prelúdio
Esta referência indica o seguinte sobre o padrão do conjunto de objetos:
O padrão de conjunto de objetos é um padrão de design criacional de software que usa um conjunto de objetos inicializados mantidos prontos para uso, em vez de alocá-los e destruí-los sob demanda.
Pelo que posso dizer,boost.pool
(simplificado) implementa o padrão de pool de objetos por meio de alocação de memória e gerenciamento baseado principalmente no tamanho de umelement_type
e retorna um ponteiro simples para um objeto alocado:
element_type * malloc();
void free(element_type * p);
Um simples exemplo de aumento também mostra que não é necessário explicitamentefree
o elemento adquirido:
X * const t = p.malloc();
... // Do something with t; don't take the time to free() it.
Questão
Eu entendo que a memória alocada será liberada com segurança na destruição do objeto pool, mas como o pool sabe quando um bloco de memória adquirido por um cliente foi liberado de volta ao pool e é reutilizável se sua interface retornar um ponteiro direto paraelement_type
, ainda uma chamada parafree()
ainda não é necessário? Ou seja, como o pool de reforço pode reutilizar essa memória se não puder ter certeza de que a memória ainda não está em uso? E se ele não reutilizar essa memória, isso é considerado o mesmo padrão que o explicado pela referência do wiki?