Dal mio programma di esempio, sembra che chiami i distruttori in entrambi i casi. A che punto chiama i distruttori per le variabili globali e classiche statiche poiché dovrebbero essere allocate nella sezione dati dello stack del programma?Il C++ chiama i distruttori per le variabili statiche globali e di classe?
risposta
Da § 3.6.3 dello standard C++ 03:
I distruttori (12.4) per oggetti inizializzati di durata di memorizzazione statica (dichiarati nell'ambito di un blocco o nell'ambito di un namespace) sono chiamati come risultato del ritorno da main e come risultato dell'uscita di chiamata (18.3). Questi oggetti vengono distrutti nell'ordine inverso del completamento del loro costruttore o del completamento della loro inizializzazione dinamica. Se un oggetto viene inizializzato staticamente, l'oggetto viene distrutto nello stesso ordine come se l'oggetto fosse inizializzato dinamicamente. Per un oggetto di tipo array o classe, tutti i sottooggetti di quell'oggetto vengono distrutti prima che qualsiasi oggetto locale con durata di archiviazione statica inizializzata durante la costruzione degli oggetti secondari venga distrutto.
Inoltre, § 9.4.2 7 paese:
membri di dati statici vengono inizializzati e distrutti esattamente come oggetti non locali (3.6.2, 3.6.3).
Tuttavia, se un distruttore non ha alcun comportamento osservabile, non può essere invocato. Terry Mahaffey dettaglia questo nel suo answer to "Is a C++ destructor guaranteed not to be called until the end of the block?".
da qualche parte dopo "principale"
(non si può sapere o fare affidamento su l'ordine esatto in cui essi sono chiamati)
Succede che _before_ 'std :: cout' è distrutto. Cioè puoi stampare cose lì. – MSalters
@MSalters Suppongo che sia solo un dettaglio della tua particolare implementazione e/o l'ordine in cui hai dichiarato i tuoi oggetti relativi a 'cout' o alla prima chiamata che richiama il suo costruttore (ad esempio' operator <<() '). Dubito che sia garantito, nel qual caso, vorrei sottolineare il "non posso fare affidamento su" in questa risposta. –
@underscore_d: No, è sicuramente una garanzia. È possibile perché la libreria standard è speciale/conosciuta per l'implementazione. – MSalters
- 1. Le variabili statiche di ASP.NET C# sono globali?
- 2. Obiettivo C - Dove affidi le variabili statiche globali?
- 3. Quando vengono inizializzate le variabili statiche e globali?
- 4. TypeScript: Best practice delle variabili statiche globali
- 5. Su variabili statiche locali e globali in C++
- 6. Variabili globali vs statiche in PHP
- 7. Variabili e filettature statiche (C)
- 8. variabili di classe statiche e serializzazione/deserializzazione
- 9. Come visualizzare le variabili statiche o globali in Eclipse CDT?
- 10. Quando vengono inizializzate le variabili const statiche globali?
- 11. Il compilatore C# converte e memorizza le variabili statiche?
- 12. ogg-c - variabili globali
- 13. variabili statiche C++ della classe senza riferimenti
- 14. Le variabili globali scherzano
- 15. Variabili globali e MPI
- 16. variabili dlopen e globali in C/C++
- 17. Perché C++ std :: list :: clear() non chiama i distruttori?
- 18. Qual è il corretto "modo C++" per fare variabili globali?
- 19. Le variabili globali e locali in R
- 20. Inalization e thread delle variabili statiche C++
- 21. variabili membro modificabili statiche in C++?
- 22. Perché dovrei inizializzare variabili di classe statiche in C++?
- 23. Le variabili di istanza sono le nuove variabili globali?
- 24. Convenzioni di denominazione in C# - Variabili globali
- 25. Variabili statiche in C#
- 26. Accesso a variabili statiche di un'altra classe
- 27. Spazio dei nomi e variabili statiche C++
- 28. Catturare le variabili globali di Nashorn
- 29. variabili globali condivise in C
- 30. Le variabili globali rallentare codice
Proprio come un'osservazione: Visual C++ 2010 sembra ignorare questo standard (tra gli altri). Non sono riuscito a prendere il punto di interruzione in un distruttore di test. Vedi: http://pastebin.com/sCMFYhzZ – progician
@progician: il distruttore ha un comportamento osservabile? È possibile che VC++ '10 sia stato autorizzato ad escludere la chiamata del distruttore. Prova a stampare un prompt, quindi a leggere l'input o ad aprire un file e scriverci sopra nel distruttore. – outis
... Naturalmente, non sarei troppo sorpreso se VC++ ignorasse lo standard. – outis