Sono contento che tu l'abbia pubblicato come una domanda. :)
Stavo cercando di dire che i distruttori e finallysono 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...");
}
finallyqui 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.printfallire, 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 finallyblocco 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);
}
finallysta 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.