2011-01-25 16 views

Respuesta

7

La memoria solo se libera una vez que el subobjeto de clase menos derivado ha sido destruido. Así que si usted tiene:

class Base { 
}; 

class Derived : public Base { 
public: 
    ~Derived(); 
}; 

entonces primera Derived se destruye, entonces Base es destruida y sólo entonces se desasigna la memoria.

+0

¿Existe realmente tal cosa? Se llama un destructor particular, que puede ser virtual si la clase lo declaró como tal. Ese destructor es responsable de destruir todos los subobjetos, y luego se libera la memoria. Todos los subobjetos sin clases base se derivan por igual y ninguno tiene una responsabilidad o importancia particular. – Potatoswatter

+0

@Potatoswatter: Tenga en cuenta que no he especificado quién es exactamente el responsable de llamar a la función de desasignación, exactamente porque hacerlo en todos los detalles requeriría una respuesta de dos páginas. – sharptooth

+0

@Potatoswatter: No estoy seguro de seguir. Ningún destructor es responsable de destruir los subobjetos. El destructor es responsable de liberar los recursos contenidos en ese objeto, pero no tiene que (ni debería) llamar al destructor de otros objetos: 'class test {string a; ~ test() {}}; 'El destructor' ~ test' está perfectamente definido en este ejemplo, no hay recursos directamente gestionados por la clase y no hace nada. El sistema llamará a '~ string' en el subobjeto' a' después de que '~ test' haya completado la ejecución, no' ~ test'. Lo mismo ocurre con la herencia, el destructor de la base se llamará automáticamente. –

2

La memoria se libera después de que el destructor ha finalizado. De lo contrario, el acceso a las variables miembro dentro del destructor causaría segfaults.

2

operador de eliminar se llama después de destructor, pero cuando se libera la memoria es usada hasta asignador

0

Me gustaría pensar que la memoria se libera después de la función de destructor en sí haya terminado de ejecutarse. Sé que cuando se detecta una excepción, el destructor del objeto no se invoca hasta que el objeto se sale del alcance.

3

Descompón delete en lo que realmente está haciendo y es relativamente claro ver cuándo se borra la memoria. Por lo que una declaración como esta:

delete some_ptr; 

Es más o menos equivalente a este pseudo-código:

some_ptr->~some_ptr(); 
free(some_ptr); 

Así se libera la memoria después de la llamada al destructor. Exactamente lo que hace el destructor no lo determina el operador delete, sino la definición de la clase. Por lo general, realiza una limpieza local y garantiza que también se invoquen sus destructores de clase base.

Es importante tener en cuenta que liberar la memoria no es realmente parte del destructor. Es el operador delete que libera la memoria.


Tenga en cuenta que la función free en pseudo-código es en realidad uno de los operator delete() funciones, ya sea para la clase eliminado o global. Eso realmente libera la memoria.

+0

Eso no es 'libre()', eso es 'operator delete()'. – sharptooth

+0

@sharptooth, ¿puedes aclarar? Mencioné que era 'pseudocódigo'. –

+1

Incluso si se trata de pseudocódigo C++ utiliza 'operator delete()' - ya sea global o de clase específica - para desasignar la memoria en la declaración 'delete'. – sharptooth

0

En C++, la destrucción consiste en ejecutar algún código utilizando los datos disponibles en el objeto. Este código es arbitrario.

Freeing la memoria es un manejo de bajo nivel, oculto por el operador delete en general, que nunca se debe llamar antes de las llamadas al destructor.

Esto se resume mejor por el Allocator interfaz:

  • allocate y deallocate se utilizan para manipular la memoria prima
  • construct y destroy se utilizan para llamar a los constructores y destructores de los objetos

Se precisa que construct, destroy y deallocate solo deben ejecutarse o n memoria asignada previamente por ese asignador. También precisa que destroy no desasigna la memoria, y que será necesaria una llamada posterior a deallocate.

Tenga en cuenta que esta es una interfaz de bajo nivel, que permite destruir un objeto y reutilizar el espacio liberado para construir otro en su lugar.

Cuestiones relacionadas