Если вы используете new
, тогда вы должны сказать delete
, чтобы убрать.
Ваш дизайн страдает от проблемы, связанной с тем, что вы сохраняете результат new
, который вы обязательно должны отслеживать в контейнере, и неясно, что может с ним случиться. Контейнер может быть опустошен или заменен или скопирован в другом месте. В конце концов, вы должны очистить, но как вы определите что очистить?
Ваш дизайн по своей природе нелокальный , что означает, что задача отслеживания указателей теперь требует полного понимания всего, что вы делаете с контейнером. Это тяжелое техническое обслуживание и ограничивает масштабируемость.
Лучшим подходом к проектированию было бы заключить результат new
в менеджер с единственной ответственностью, такой как shared_ptr
или unique_ptr
, и сохранить те в контейнере. Таким образом, всегда совершенно ясно, кому принадлежат объекты, выделенные вручную, и кто распоряжается ими, если ссылка станет недоступной или потерянной.
[ Оригинальное обновление: ] В качестве предложения для вашего оригинального дизайна, который может или не может быть уместным (в зависимости от многих других факторов, о которых вы не говорите нам), и несмотря на все его недостатки, вы можете заставить Holder
выполнить очистку и указать в договоре, что вы обещаете add
только указатели, которые вы создали с new
:
Holder::~Holder() {
for (auto it = collection.cbegin(); it != collection.cend(); ++it)
delete *it;
}
Это требует строгого контракта между классом и пользователем, поэтому убедитесь, что вы намерены это сделать, задокументируете его и, самое главное, напишите или удалите конструкторы копирования и операторы присваивания.