2012-02-28 27 views
12

Mi pregunta es simple, pero no he podido encontrar la pregunta en ningún lado.Se llama al destructor automáticamente

Si tengo una clase como tales

class A { 
    vector<int> data; 
} 

Cuando una instancia de A se destruye se data también se destruyen correctamente, o debo escribir un destructor para A que llama data 's destructor? Básicamente me preocupaba si la memoria dinámica del vector no se liberaría cuando se destruyera una instancia de A. Sospecho que la respuesta es que data se libera correctamente, pero no quiero descubrir que estoy equivocado de la manera difícil.

Además, si A fuera una estructura ¿se llamaría al destructor para data cuando una instancia local de A queda fuera del alcance?

+2

Le falta un punto y coma después de la declaración de 'clase A' (que no es realmente una declaración ya que falta ... bueno). –

Respuesta

14

Sí, data se destruirá automáticamente, no necesita hacer nada para lograrlo. vector se encargará de la limpieza de la memoria dinámica asignada por este. El destructor del vector se invocará automáticamente cuando se destruya una instancia de A.

No hay diferencia en el comportamiento, independientemente de si A es class o struct.

+14

+1 Para que quede claro, "vector gestionará la limpieza de la memoria dinámica asignada * por * it", no * a * it. Si almacena objetos dinámicamente asignados en un vector, es su responsabilidad 'eliminarlos' en consecuencia. – netcoder

+0

@netcoder encuentra su comentario un poco engañoso. Puede almacenar en un vector ** punteros a objetos dinámicamente asignados ** pero no creo que pueda almacenar los "objetos" mismos que están dinámicamente asignados en un vector. Si declara un vector donde ClassA es un nombre de clase, entonces vector se encargará de la destrucción de los objetos ClassA que contiene.Por supuesto, si sus objetos ClassA contienen punteros a otros objetos, entonces es responsabilidad de ** ClassA eliminarlos **, ** NO es responsabilidad de Vector **, pero esa es otra historia. –

2

No es necesario, se llaman siempre los destructores de los miembros de datos.

Un destructor explícito es útil la gestión de memoria manual

struct a{ 
    int* ip; 
    a() 
    : ip(new int(5)) 
    { } 

    ~a() { delete ip; } 
}; 

Dicho esto, en general usted debe hablar contenedores de uso RAII (como punteros inteligentes) así que personalmente rara vez escribir dtors allí días.

Y la excepción a esto es declarar un dtor de clases base como virtual.

struct base { 
    virtual ~base() {} 
}; 
struct child : public base { 
    //base and child destructor automatically called 
} 
+0

+1 para cumplir con los buenos principios de RAII. La necesidad de escribir manualmente destructores debería ser cada vez menor cuando las personas codifican C++ de la misma manera que Stroustrup, Sutter, Meyers y otros pensadores modernos de C++ intentan escribirlo. – stinky472

1

El compilador crea automáticamente un destructor predeterminado si usted mismo no define uno. En general, no es necesario que cree su propio destructor a menos que tenga datos de puntero -miembros que "poseen" la memoria a la que apuntan, y/o está diseñando su clase para ser derivada por otras clases, en cuyo punto usted querría para al menos declarar un destructor virtual vacío.

En todos los casos, tanto con su propio destructor como con el destructor creado por el compilador predeterminado, todos los destructores para miembros de datos no estáticos así como cualquier clase base de la clase actual se llaman al final de el destructor y antes de que la función destructor regrese.

Cuestiones relacionadas