Si elimino un objeto que hace que se llame a su destructor, ¿la memoria se libera antes o después de que el destructor haya terminado de hacer lo que haya en la función?C++ destructor: cuando la memoria se libera?
Respuesta
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.
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.
operador de eliminar se llama después de destructor, pero cuando se libera la memoria es usada hasta asignador
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.
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.
Eso no es 'libre()', eso es 'operator delete()'. – sharptooth
@sharptooth, ¿puedes aclarar? Mencioné que era 'pseudocódigo'. –
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
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
ydeallocate
se utilizan para manipular la memoria primaconstruct
ydestroy
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.
- 1. ¿Un programa C++ libera automáticamente la memoria cuando se bloquea?
- 2. ¿La memoria filtrada se libera cuando sale el programa?
- 3. ¿Se libera la memoria cuando lanzo una excepción?
- 4. Cuando File.ReadLines libera recursos
- 5. ¿View.removeAllViews() libera memoria?
- 6. .net ¿ArrayList.Clear libera memoria?
- 7. ¿la memoria asignada por kmalloc() se libera automáticamente?
- 8. Extracción CAKeyframeAnimation no libera la memoria
- 9. UIImagePickerController no libera la memoria que ocupa
- 10. Delphi - Minimize & Restore libera la memoria?
- 11. ¿Cómo se libera la memoria en xcode 4.2?
- 12. Destructor virtual: ¿es necesario cuando no se asigna dinámicamente la memoria?
- 13. Se llama al destructor automáticamente
- 14. La lectura desde la transmisión PackagePart no libera la memoria
- 15. ¿Cómo se libera el espacio asignado dinámicamente cuando se interrumpe un programa con Ctrl-C?
- 16. ¿ARC libera memoria malloc'ed para usted?
- 17. ¿Por qué performGC no libera toda la memoria?
- 18. cuando se lanzará la memoria?
- 19. MKMapView initWithFrame no libera memoria con ARC
- 20. Stopping destructor se llama
- 21. ¿Salir de un pthread libera la memoria mallada?
- 22. ¿Cuándo se llama un destructor de C++?
- 23. cuando para liberar el puntero en C y cómo saber si se libera
- 24. Uso del destructor en C#?
- 25. Destructor en Objective-C++
- 26. C# Destructor no funciona como se esperaba
- 27. cocoa ¿Los binarios de 64 bits pierden memoria? (liberar NSData no libera la memoria)
- 28. ¿Cómo saber cuándo se libera la memoria de un objeto Java?
- 29. ¿La memoria de una matriz (de caracteres) se libera al salir del alcance?
- 30. Matplotlib Python: la memoria no se libera al especificar el tamaño de la figura
¿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
@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
@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. –