c++ - metodos - objetos en c
¿Std:: vector llama al destructor de punteros a objetos? (3)
Posible duplicado:
Eliminar punteros en un vector
Sé que cuando se destruye un std::vector
, llamará al destructor de cada uno de sus elementos. ¿Llama al destructor de punteros a objetos?
vector<myclass*> stuff;
Cuando se destruyen las cosas, ¿se destruyen los objetos individuales apuntados por los punteros dentro de las cosas?
Como dijiste correctamente, el vector llama a los destructores por sus elementos. Entonces, en tu ejemplo, el vector llama "destructores de punteros". Sin embargo, debes tener en cuenta que los tipos de punteros no tienen destructores. Sólo los tipos de clase pueden tener destructores. Y los punteros no son clases. Por lo tanto, es más correcto decir que std::vector
aplica la sintaxis de llamada de pseudo-destructor a los objetos punteros almacenados en el vector. Para los tipos de punteros que no funcionan, es decir, no hace nada.
Esto también responde a la segunda parte de su pregunta: si los objetos myclass
apuntados por los punteros se destruyen. No, no se destruyen.
Además, parece que de alguna manera usted cree que "llamar a los destructores en los punteros" (la primera parte de su pregunta) es lo mismo que "destruir los objetos puntiagudos" (la segunda parte de su pregunta). En realidad estas son dos cosas no relacionadas completamente diferentes.
Para crear un enlace desde el primero al último, es decir, para hacer que el vector destruya los objetos puntiagudos, debe crear su vector a partir de algún tipo de "punteros inteligentes", a diferencia de los punteros ordinarios myclass *
. El vector llamará automáticamente a los destructores de los "punteros inteligentes" y estos destructores, a su vez, destruirán los objetos puntiagudos. Este "enlace" solo se puede implementar explícitamente, dentro del destructor "puntero inteligente", por lo que los punteros en bruto comunes no pueden ayudarlo aquí.
No.
¿Cómo se supone que std::vector
sabe cómo destruir el objeto apuntado? ¿Debería utilizar delete
? delete[]
? free
? Alguna otra función? ¿Cómo se supone que se sepa que los objetos apuntados están realmente asignados dinámicamente o que es el único propietario verdadero y es responsable de destruirlos?
Si el std::vector
es el único propietario verdadero de los objetos apuntados, use std::unique_ptr
, potencialmente con un borrador personalizado para manejar la limpieza de los objetos.
No; ¿Qué pasa si almacena un puntero a un objeto automático?
vector<T*> v;
T tinst;
v.push_back(&tinst);
Si el vector llama a los destructores de los objetos a los que apuntan los punteros, el objeto automático se destruiría dos veces: una vez que quedara fuera del alcance y una vez cuando el vector quedara fuera del alcance. Además, ¿qué pasa si se supone que no se deben delete
asignación? No hay forma de que pueda comportarse adecuadamente en cada situación.
Si todos sus objetos están asignados dinámicamente, debe iterar manualmente el vector y delete
cada puntero si se asignó con new
. Alternativamente, puede crear un vector de punteros inteligentes que desasignará los objetos apuntados por los punteros:
vector<shared_ptr<T>> v;
v.push_back(new T);