Me alegra que hayas publicado esto como una pregunta. :)
Estaba tratando de decir que los destructores y finally
conceptualmente son diferentes:
- Los destructores son para liberar recursos ( datos )
finally
es para volver a la persona que llama ( control )
Considere, digamos, este pseudocódigo hipotético:
try {
bar();
} finally {
logfile.print("bar has exited...");
}
finally
aquí está resolviendo completamente un problema de control y no un problema de gestión de recursos.
No tendría sentido hacer eso en un destructor por una variedad de razones:
- No lo está siendo "adquirida" o "creado"
- Si no se imprime en el archivo de registro no se producirán fugas de recursos, corrupción de datos, etc. (suponiendo que el archivo de registro aquí no se envíe al programa en otro lugar)
- Es legítimo
logfile.print
fracasar, mientras que la destrucción (conceptual) no puede fallar
Aquí hay otro ejemplo, esta vez como en 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();
En el ejemplo anterior, nuevamente, no hay recursos para liberar.
De hecho, el finally
bloque está adquiriendo recursos internamente para lograr su objetivo, lo que podría fallar. Por lo tanto, no tiene sentido usar un destructor (si Javascript tenía uno).
Por otro lado, en este ejemplo:
b = get_data();
try {
a.write(b);
} finally {
free(b);
}
finally
está destruyendo un recurso, b
. Es un problema de datos. El problema no se trata de devolver limpiamente el control a la persona que llama, sino de evitar pérdidas de recursos.
El fracaso no es una opción, y nunca (conceptualmente) debería ocurrir.
Cada lanzamiento de b
necesariamente está emparejado con una adquisición, y tiene sentido usar RAII.
En otras palabras, solo porque puede usar cualquiera para simular eso no significa que ambos son el mismo problema o que ambos son soluciones apropiadas para ambos problemas.