Desde mi programa de ejemplo, parece que llama a los destructores en ambos casos. ¿En qué punto llama a los destructores para variables globales y estáticas de clase, ya que deberían asignarse en la sección de datos de la pila de programas?¿C++ llama a los destructores para variables estáticas globales y de clase?
Respuesta
De § 3.6.3 de la norma C++ 03:
Destructores (12.4) para objetos inicializados de duración de almacenamiento estático (declarados en alcance de bloque o en ámbito de espacio de nombres) son llamados como resultado de regresar de main y como resultado de la llamada de salida (18.3). Estos objetos se destruyen en el orden inverso de la finalización de su constructor o de la finalización de su inicialización dinámica. Si un objeto se inicializa estáticamente, el objeto se destruye en el mismo orden que si el objeto se hubiera inicializado dinámicamente. Para un objeto de matriz o tipo de clase, todos los subobjetos de ese objeto se destruyen antes de que se destruya cualquier objeto local con duración de almacenamiento estático inicializada durante la construcción de los subobjetos.
Además, § 9.4.2 7 estados:
miembros de datos estáticos se inicializan y destruyeron exactamente igual que los objetos no locales (3.6.2, 3.6.3).
Sin embargo, si un destructor no tiene un comportamiento observable, es posible que no se invoque. Terry Mahaffey detalla esto en su answer to "Is a C++ destructor guaranteed not to be called until the end of the block?".
En algún lugar después de "principal"
(no se puede saber o confiar en el orden exacto en el que se les llama)
Sucede _antes de que 'std :: cout' se destruya. Es decir. puedes imprimir cosas allí. – MSalters
@MSalters Supongo que es solo un detalle de su implementación particular y/o el orden en el que declaró sus objetos relativos a 'cout' o la primera llamada que invoca a su constructor (por ejemplo' operator <<() '). Dudo que esté garantizado, en cuyo caso, volvería a enfatizar el "no puedo confiar" en esta respuesta. –
@underscore_d: No, definitivamente es una garantía. Es posible porque la Biblioteca estándar es especial/conocida para la implementación. – MSalters
- 1. variables estáticas locales y globales en C++
- 2. gcov y destructores globales
- 3. variables globales estáticas y externas en C y C++
- 4. ASP.NET C# Las variables estáticas son globales?
- 5. Las variables estáticas en C y C++
- 6. variables estáticas en c
- 7. C++ inicializa variables estáticas en clase?
- 8. variables globales en C++
- 9. Variables globales y MPI
- 10. ¿Accediendo a variables de clase estáticas en C++?
- 11. C++ de variables globales
- 12. Variables estáticas en C++
- 13. objetivo-c - variables globales
- 14. C# Las variables estáticas - alcance y persistencia
- 15. C++ liberando variables estáticas
- 16. variables de clase objetivo-c: ¿cuándo se llama a dealloc?
- 17. Salir de un bloque: ¿se llama a los destructores?
- 18. ver variables globales/estáticas/heredadas en eclipse debugger
- 19. C# - Winforms - Variables globales
- 20. ¿Por qué C++ std :: list :: clear() no llama a destructores?
- 21. ¿Hay equivalentes a "esto" para variables estáticas en C#
- 22. inicialización de variables estáticas
- 23. Variables estáticas en C#
- 24. Greasemonkey y variables globales
- 25. Razones para utilizar las funciones estáticas y variables en C
- 26. Cómo hacer cumplir una orden de llamar a los destructores
- 27. ¿Cómo ver variables estáticas o globales en Eclipse CDT?
- 28. variables globales compartidas en C
- 29. Cómo definir y usar variables estáticas en la clase F #
- 30. Variables globales en C# .net
Solo como una observación: Visual C++ 2010 parece ignorar este estándar (entre otros). No pude atrapar el punto de interrupción en un destructor de prueba. Ver: http://pastebin.com/sCMFYhzZ – progician
@progician: ¿el destructor tiene un comportamiento observable? Es posible que VC++ '10 haya permitido eludir la llamada al destructor. Intente imprimir un mensaje y luego leer la entrada, o abrir un archivo y escribir en el destructor. – outis
... Por supuesto, no me sorprendería demasiado si VC++ ignorara el estándar. – outis