2012-11-27 11 views

risposta

20

E 'ben definito, e dipende dal fatto che l'oggetto in questione è stato costruito prima o dopo la funzione ottenuto registrata utilizzando atexit():

3.6.3 Terminazione

3. Se il completamento dell'inizializzazione di un oggetto con durata dell'archiviazione statica viene sequenziato prima di una chiamata a std::atexit (vedere <cstdlib>, 18,5), la chiamata alla funzione passata a std::atexit viene eseguita prima della c tutto al distruttore per l'oggetto. Se una chiamata a std::atexit viene eseguita in sequenza prima del completamento dell'inizializzazione di un oggetto con durata di archiviazione statica, la chiamata al distruttore per l'oggetto viene sequenziata prima che la chiamata alla funzione passata a std::atexit. Se una chiamata a std::atexit viene sequenziata prima di un'altra chiamata a std::atexit, la chiamata alla funzione passata alla seconda chiamata std::atexit viene sequenziata prima che la chiamata alla funzione passata alla prima chiamata std::atexit. interpretazione

mio laico di quanto sopra è quella roba che ha ottenuto costruita prima chiamato atexit(handler) viene distrutta dopohandler() si chiama, e viceversa. Sono sicuro che ci sono sottigliezze, ma questo sembra essere il principio di base.

+4

Fondamentalmente sì. La formulazione dello standard è più complicata perché in un programma multithreading, "before" e "after" hanno definizioni complicate e non sempre si comportano come ci si aspetterebbe. – aschepler

+1

Con una nota che 'built' significa * il costruttore terminato * e che consideriamo solo oggetti completi, non basi o attributi. –

Problemi correlati