Diciamo che ho due oggetti locali. Quando la funzione ritorna, è garantito quale sarà il primo a uscire dal campo di applicazione?Distruttore dell'ordine e del punto di chiamata
Ad esempio:
Ho una classe come questa:
class MutexLock
{
/* Automatic unlocking when MutexLock leaves a scope */
public:
MutexLock (Mutex &m) { M.lock(); }
~MutexLock(Mutex &m) { M.unlock(); }
};
Questo è un trucco molto comune utilizzato per rilasciare automaticamente il mutex quando si va fuori del campo di applicazione. Ma cosa succede se ho bisogno di due mutex nell'ambito?
void *func(void *arg)
{
MutexLock m1;
MutexLock m2;
do_work();
} // m1 and m2 will get unlocked here. But in what order? m1 first or m2 first?
Questo davvero non può causare alcun deadlock. Ma ci possono essere casi in cui l'ordine di rilascio della risorsa potrebbe essere utile all'utente. In tal caso è importante essere espliciti piuttosto che affidarsi ai distruttori?
Inoltre, la distruzione può essere ritardata dal compilatore in ogni caso? Quello che voglio dire è
func()
{
{
foo f();
} ---------> Can compiler choose to not destroy f here, rather do it at the time when func() is returning.
}
Per supportare la prima parte della risposta di @ aix, questo è un estratto dallo standard (versione bozza, Data: 2006-11-06 --- questo aspetto non è cambiato nelle versioni successive. Riferimenti alle sezioni omesse per chiarezza): "All'uscita da un ambito (comunque compiuto), i distruttori vengono chiamati per tutti gli oggetti costruiti con durata di archiviazione automatica (oggetti o temporali denominati) dichiarati in tale ambito, nell'ordine inverso della loro dichiarazione." Ovviamente il tuo esempio riguarda dichiarazioni di variabili automatiche. – sturmer