Моя немедленная реакция (и я признаю, что это не более того) звучит так, как будто вы пытаетесь получить эффект какого-то распределителя пула.Возможно, вам лучше перегрузить operator new
и operator delete
, чтобы получить желаемый эффект чуть более напрямую.С чем-то подобным вы, вероятно, можете просто использовать shared_ptr
, как обычно, и другая работа, которую вы хотите отложить, будет обработана в operator delete
для этого класса.
Это оставляет более простой вопрос: чтоВы действительно пытаетесь достичь этого?С точки зрения управления памятью, одно общее желание состоит в том, чтобы выделять память для большого количества объектов одновременно, и после того, как весь блок пуст, освободить весь блок сразу.Если вы пытаетесь сделать что-то в этом порядке, это почти наверняка легче сделать, перегружая new
и delete
, чем играть в игры с shared_ptr
s use_count
.
Редактировать: на основев вашем комментарии перегрузка new
и delete
для класса звучит как правильная вещь.Во всяком случае, интеграция в существующий код, вероятно, будет проще;на самом деле, вы часто можете делать это совершенно прозрачно.
Общая идея распределителя в значительной степени такая же, как вы обрисовали в отредактированном вопросе: иметь структуру (растровые изображения и связанные списки являются общими)отслеживать ваши бесплатные объекты.Когда new
требуется выделить объект, он может сканировать битовый вектор или просматривать заголовок связанного списка свободных объектов и возвращать его адрес.
Это один случай, когда связанные списки могут работатьдовольно хорошо - вам (как правило) не нужно беспокоиться об использовании памяти, потому что вы храните свои ссылки прямо в свободном объекте, и вам (практически) никогда не придется ходить по списку, потому что, когда вам нужно выделить объект,Вы просто берете первый элемент в списке.
Подобные вещи особенно характерны для небольших объектов, поэтому вы можете захотеть взглянуть на главу Modern C ++ Design , посвященную распределителю небольших объектов.(и с тех пор одна-две статьи Андрея Александреску о его новых идеях о том, как делать такие вещи).Также есть распределитель Boost :: pool, который, по крайней мере, несколько похож.