Контейнеры STL имеют семантику значений. Когда вы нажимаете объект в контейнер STL, контейнер STL сохраняет свою собственную копию объекта, а когда объект (внутренняя копия) удаляется из контейнера, он уничтожается.
Если вы использовали контейнер типа прокси, в качестве исходных указателей, интеллектуальных указателей (shared_ptr, weak_ptr) или адаптеров (в качестве boost :: reference_wrapper), тогда STL-контейнер уничтожит прокси-сервер, но не тип. Выбор одного над другими обычно зависит от того, как вы хотите иметь дело с ресурсами.
Наиболее распространенная идиома использует необработанные указатели, но они не явны, кто ответственен за уничтожение (код, который извлекается из контейнера, должен удалить указатель, или ресурс обрабатывается где-то еще?).
Современное использование движется к подходу shared_ptr, так как оно разбавляет проблему владения. Объект будет гарантированно быть живым, когда вы вынимаете его из контейнера, а если никто другой не держит shared_ptr, тогда объект будет автоматически удален, когда локальный shared_ptr выходит за рамки. Использование функции weak_ptr сохранит право собственности в исходном коде, но позволит вам проверить правильность указателя (если он был удален) перед использованием. Это может позволить вам избежать выполнения операции над объектом, который будет удален сразу.
Проблема с подходом shared_ptr/weak_ptr заключается в том, что она заставляет вас использовать shared_ptr для хранения исходного ресурса. Это означает, что вы не сможете поместить указатель в подобъект (член-атрибут) другого класса без переоценки класса для хранения атрибута через shared_ptr, и это будет иметь другие последствия (атрибуты больше не будут смежными в памяти , потребуются более динамические операции выделения ...)
Техника, которая вряд ли встречается, использует адаптеры в качестве boost :: reference_wrapper <>. Опорная оболочка - это прокси-объект, который содержит ссылку на исходный объект и сам можно копировать. Преимущество над обычными указателями состоит в том, что при чтении кода ясно, что ресурс управляется за пределами очереди: код, который извлекает данные из очереди, не нуждается в удалении объекта. Преимущество подхода smart pointer заключается в том, что вам не нужно перепроектировать другие части вашей системы, чтобы использовать интеллектуальные указатели. Недостаток заключается в том, что, как и в подходе с необработанным указателем, вы должны убедиться, что время жизни упомянутого объекта обходит ссылку в контейнере вручную.
Если вы храните указатели внутри очереди, их удаление не будет вызывать деструктор. –
Аналогичный вопрос: http://stackoverflow.com/questions/1525535/delete-all-items-from-a-c-stdvector –