Контейнеры 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 для хранения исходного ресурса. Это означает, что вы не сможете поместить указатель в подобъект (атрибут member) другого класса, не изменив класс для хранения атрибута через shared_ptr, и это будет иметь другие последствия (атрибуты больше не будут смежными в памяти , потребуются более динамические операции выделения ...)
Техника, которая едва заметна, использует адаптеры как boost :: reference_wrapper <>. Оболочка ссылки - это прокси-объект, который содержит ссылку на исходный объект и сам является копируемым. Преимущество перед простыми необработанными указателями состоит в том, что при чтении кода становится очевидным, что ресурс управляется вне очереди: код, который извлекает данные из очереди, не должен удалять объект. Преимущество перед умным указателем заключается в том, что вам не нужно перепроектировать другие части вашей системы, чтобы использовать умные указатели. Недостаток заключается в том, что, как и в подходе с необработанным указателем, вы должны убедиться, что время жизни упомянутого объекта превосходит ссылку в контейнере вручную.