2011-05-13 14 views

Respuesta

6

Si elimina un objeto, se llamará al destructor para ese objeto, por lo que debe hacer una eliminación en el destructor. Así que recuerde, todo lo que la clase ha asignado en el montón debe liberarse en el destructor. Si se ha asignado en la pila esto sucede automáticamente

struct A 
{ 
    A() { std::cout << "A()" << std::endl; ptr = new char[10]; } 
    ~A() { std::cout << "~A()" << std::endl; delete []ptr; } 
    char *ptr; 
}; 

Pero cuidado, si está utilizando la herencia, si A hereda de una clase base, que necesita para hacer el destructor base virtual, o bien el destructor en A no se llamará y tendrá una pérdida de memoria.

struct Base 
{ 
    virtual ~Base() {} 
}; 

struct A : public Base 
{ 
    A() { std::cout << "A()" << std::endl; ptr = new char[10]; } 
    ~A() { std::cout << "~A()" << std::endl; delete []ptr; } 
    char *ptr; 
}; 
3

Se quedarían atrapados en la memoria. Por lo tanto, necesita definir Destructor cuando realiza la asignación de memoria dinámica dentro de los objetos. El D'tor se invoca cuando el objeto primario está a punto de ser eliminado, y debe liberar explícitamente en el D'tor toda la memoria asignada.

Para obtener más información, consulte Wikipedia.

+3

Y cuando define un destructor, debe definir también un constructor de copia y un operador de asignación de copia. [Ver aquí] (http://stackoverflow.com/questions/4172722/). –

+1

@Space: Incorrecto ... La regla de tres no incluye * constructor *: [Ver wiki] (http://en.wikipedia.org/wiki/Rule_of_three_ (C% 2B% 2B_programming)) – Nawaz

+0

@Nawaz: Gracias . Eso fue un error tipográfico ¿Mejor ahora? –

1

Sí, harías la limpieza de la memoria en el destructor de la clase.

1

El puntero tiene que ser delete explícitamente (por usted o algún envoltorio biblioteca). Por ejemplo;

struct A { 
    char *p; // assume p = new char[] somewhere; 
}; 

A* pA = new A; 
delete pA; // <-- this doesn't clean up char* p 
1

El objeto solo limpiaría los punteros si se lo indicó específicamente en el Deconstructor.

1

Si una clase está escrita correctamente, la eliminación de una instancia de esa clase debe liberar todos los recursos asignados por esa clase.

Si la clase almacena punteros en la memoria que no no asignar, a menos que la documentación especifique lo contrario, generalmente no se espera que borre esos punteros.

Cuestiones relacionadas