Los contenedores STL tienen una semántica de valores. Cuando inserta un objeto en un contenedor STL, el contenedor STL guarda su propia copia del objeto, y cuando el objeto (copia interna) se elimina del contenedor, se destruye.
Si utilizó un contenedor de tipo proxy, como punteros sin formato, punteros inteligentes (shared_ptr, weak_ptr) o adaptadores (como boost :: reference_wrapper), el contenedor STL destruirá el proxy pero no el tipo. Elegir uno sobre los demás suele ser una cuestión de cómo desea tratar con los recursos.
La expresión más común es usar punteros crudos, pero no especifican quién está a cargo de la destrucción (¿el código que extrae del contenedor debe eliminar el puntero o el recurso se maneja en otro lugar?).
El uso moderno se mueve hacia el enfoque shared_ptr, ya que diluye el problema de propiedad. Se garantizará que el objeto esté activo cuando lo saque del contenedor, y si nadie más tiene un shared_ptr, entonces el objeto se eliminará automáticamente cuando el local shared_ptr quede fuera del alcance. El uso de un weak_ptr mantendrá la propiedad en el código original, pero le permitirá verificar la validez del puntero (si se eliminó) antes del uso. Esto podría permitirle evitar realizar la operación en un objeto que se eliminará de inmediato.
El problema con el enfoque shared_ptr/weak_ptr es que te obliga a utilizar shared_ptr para contener el recurso original. Esto significa que no podrá poner un puntero en un subobjeto (atributo miembro) de otra clase sin rediseñar la clase para mantener el atributo a través de un shared_ptr, y eso tendrá otras implicaciones (los atributos ya no serán contiguos en la memoria) , se requerirán operaciones de asignación más dinámicas ...)
Una técnica que apenas se ve es el uso de adaptadores como boost :: reference_wrapper <>. Un contenedor de referencia es un objeto proxy que contiene una referencia al objeto original y se puede copiar por sí mismo. La ventaja sobre los punteros brutos simples es que al leer el código está claro que el recurso se gestiona fuera de la cola: el código que extrae los datos de la cola no necesita eliminar el objeto. La ventaja sobre el enfoque del puntero inteligente es que no necesita rediseñar otras partes de su sistema para usar punteros inteligentes. La desventaja es que, como en el enfoque del puntero sin formato, debe asegurarse de que la duración del objeto referido supere la referencia en el contenedor de forma manual.
si está almacenando punteros dentro de la cola, eliminarlos no llamará al destructor. –
Una pregunta similar: http://stackoverflow.com/questions/1525535/delete-all-items-from-a-c-stdvector –