Wie erreicht boost.pool die Wiederverwendung des zugewiesenen Speichers?
Hintergrund
Meinevorherige Frage Überboost.pool
veranlasste mich, boost.pool im Detail zu untersuchen, und jetzt habe ich eine zusätzliche Frage, um mein Verständnis zu vervollständigen.
Auftakt
Diese Referenz gibt Folgendes über das Objektpoolmuster an:
Das Objektpoolmuster ist ein von der Software erstelltes Entwurfsmuster, das eine Reihe von initialisierten Objekten verwendet, die zur Verwendung bereitgehalten werden, anstatt sie bei Bedarf zuzuweisen und zu zerstören.
Nach allem, was ich sagen kann,boost.pool
(vereinfacht) implementiert das Objektpoolmuster durch Speicherzuweisung und -verwaltung, hauptsächlich basierend auf der Größe eineselement_type
, und gibt einen einfachen Zeiger auf ein zugewiesenes Objekt zurück:
element_type * malloc();
void free(element_type * p);
Ein einfaches Boost-Beispiel zeigt auch, dass dies nicht explizit erforderlich istfree
das erworbene Element:
X * const t = p.malloc();
... // Do something with t; don't take the time to free() it.
Frage
Ich verstehe, dass der zugewiesene Speicher bei der Zerstörung des Pool-Objekts sicher freigegeben wird, aber woher weiß der Pool, wann ein von einem Client erworbener Speicherblock wieder in den Pool freigegeben wurde, und ist wiederverwendbar, wenn seine Schnittstelle einen direkten Zeiger zurückgibt zuelement_type
, noch ein anruf anfree()
ist noch nicht erforderlich? d.h. wie kann der Boost-Pool diesen Speicher wiederverwenden, wenn nicht sicher ist, dass der Speicher noch nicht verwendet wird? Und wenn dieser Speicher nicht wiederverwendet wird, wird dies sogar als dasselbe Muster angesehen wie das, das in der Wiki-Referenz erklärt wird?