Si può essere confusi da un comportamento non definito qui. Lo standard C++ non ha regole su ciò che accade se usi un oggetto dopo che il suo distruttore è stato eseguito, poiché è un comportamento indefinito, e quindi l'implementazione può fare qualsiasi cosa voglia. In genere, i progettisti di compilatori non fanno nulla di speciale per un comportamento indefinito, e quindi ciò che accade è un artefatto di quali altre decisioni di progettazione sono state prese. (Ciò può causare risultati davvero strani a volte.)
Pertanto, una volta eseguito il distruttore, il compilatore non ha alcun obbligo in merito a quell'oggetto. Se non ti riferisci di nuovo, non importa. Se fai riferimento ad esso, è un comportamento indefinito, e dal punto di vista dello Standard il comportamento non ha importanza, e poiché lo Standard non dice nulla, la maggior parte dei progettisti di compilatori non si preoccuperà di ciò che fa il programma.
In questo caso, la cosa più semplice da fare è lasciare l'oggetto inalterato, poiché non sta trattenendo risorse, e la sua memoria è stata allocata come parte dell'avvio della funzione e non verrà recuperata fino alla funzione uscite. Pertanto, il valore del membro dati rimarrà lo stesso.La cosa naturale da fare per il compilatore quando legge ob2.day
è accedere alla posizione di memoria.
Come qualsiasi altro esempio di comportamento non definito, i risultati potrebbero cambiare in qualsiasi cambiamento di circostanze, ma in questo caso probabilmente non lo faranno. Sarebbe bello se i compilatori catturassero più casi di comportamento non definito e problemi di diagnostica, ma non è possibile per i compilatori rilevare tutti i comportamenti non definiti (alcuni si verificano in fase di runtime) e spesso non controllano comportamenti che non pensano probabile.
fonte
2010-10-27 19:34:54
Un sacco di risposte fanno riferimento "allo stack". Se non sei sicuro di quale sia lo stack, leggi questa pagina: http://web.archive.org/web/20071029040931/www.dirac.org/linux/gdb/02a-Memory_Layout_A_Stack.php –