Sono contento che tu l'abbia pubblicato come una domanda. :)
Stavo cercando di dire che i distruttori e finally
sono concettualmente diversi:
- I distruttori sono per il rilascio di risorse ( dati )
finally
è per tornare al chiamante ( controllo )
Considera, diciamo, questo ipotetico pseudo-codice:
try {
bar();
} finally {
logfile.print("bar has exited...");
}
finally
qui sta risolvendo interamente un problema di controllo e non un problema di gestione delle risorse.
Non avrebbe senso farlo in un distruttore per una serie di motivi:
- Nessuna cosa viene "acquisita" o "creata"
- La mancata stampa nel file di registro non comporterà perdite di risorse, corruzione dei dati, ecc. (Presupponendo che il file di registro qui non venga reinserito nel programma altrove)
- È legittimo
logfile.print
fallire, mentre la distruzione (concettualmente) non può fallire
Ecco un altro esempio, questa volta come in Javascript:
var mo_document = document, mo;
function observe(mutations) {
mo.disconnect(); // stop observing changes to prevent re-entrance
try {
/* modify stuff */
} finally {
mo.observe(mo_document); // continue observing (conceptually, this can fail)
}
}
mo = new MutationObserver(observe);
return observe();
Nell'esempio sopra, ancora una volta, non ci sono risorse da rilasciare.
In effetti, il finally
blocco sta acquisendo risorse internamente per raggiungere il suo obiettivo, che potrebbe potenzialmente fallire. Quindi, non ha senso usare un distruttore (se Javascript ne aveva uno).
D'altra parte, in questo esempio:
b = get_data();
try {
a.write(b);
} finally {
free(b);
}
finally
sta distruggendo una risorsa, b
. È un problema di dati. Il problema non è di restituire in modo pulito il controllo al chiamante, ma piuttosto di evitare perdite di risorse.
Il fallimento non è un'opzione e non dovrebbe (concettualmente) mai accadere.
Ogni versione di b
è necessariamente associata a un'acquisizione e ha senso usare RAII.
In altre parole, solo perché è possibile utilizzare sia per simulare sia ciò non significa che entrambi siano lo stesso problema o che entrambi siano soluzioni appropriate per entrambi i problemi.