Ich bin froh, dass du dies als Frage gepostet hast. :)
Ich habe versucht zu sagen, dass Destruktoren und finally
konzeptionell unterschiedlich sind:
- Destruktoren sind für die Freigabe von Ressourcen ( Daten )
finally
ist für die Rückkehr zum Anrufer ( Kontrolle )
Betrachten Sie beispielsweise diesen hypothetischen Pseudocode:
try {
bar();
} finally {
logfile.print("bar has exited...");
}
finally
Hier wird ein Steuerungsproblem und kein Ressourcenverwaltungsproblem vollständig gelöst.
Es wäre aus verschiedenen Gründen nicht sinnvoll, dies in einem Destruktor zu tun:
- Kein Ding wird „erworben“ oder „geschaffen“
- Wenn nicht in die Protokolldatei gedruckt wird, führt dies nicht zu Ressourcenlecks, Datenbeschädigungen usw. (vorausgesetzt, die Protokolldatei wird hier nicht an anderer Stelle in das Programm zurückgespeist).
- Es ist legitim
logfile.print
zu scheitern, wohingegen Zerstörung (konzeptionell) nicht scheitern kann
Hier ist ein weiteres Beispiel, diesmal wie 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();
Auch im obigen Beispiel müssen keine Ressourcen freigegeben werden.
In der Tat, das finally
ist Block Erwerb Ressourcen intern ihr Ziel zu erreichen, die möglicherweise ausfallen könnten. Daher ist es nicht sinnvoll, einen Destruktor zu verwenden (falls Javascript einen hat).
Andererseits in diesem Beispiel:
b = get_data();
try {
a.write(b);
} finally {
free(b);
}
finally
eine Ressource zerstört, b
. Es ist ein Datenproblem. Das Problem besteht nicht darin, die Kontrolle sauber an den Anrufer zurückzugeben, sondern vielmehr, Ressourcenlecks zu vermeiden.
Ein Ausfall ist keine Option und sollte (konzeptionell) niemals auftreten.
Jedes Release von b
ist zwangsläufig mit einer Akquisition verbunden, und es ist sinnvoll, RAII zu verwenden.
Mit anderen Worten, nur weil Sie entweder zum Simulieren verwenden können, bedeutet dies nicht, dass beide ein und dasselbe Problem sind oder dass beide geeignete Lösungen für beide Probleme sind.