considerar esta clase simple que demuestra RAII en C++ (Desde la parte superior de la cabeza):¿Cuándo tiene RAII una ventaja sobre GC?
class X {
public:
X() {
fp = fopen("whatever", "r");
if (fp == NULL)
throw some_exception();
}
~X() {
if (fclose(fp) != 0){
// An error. Now what?
}
}
private:
FILE *fp;
X(X const&) = delete;
X(X&&) = delete;
X& operator=(X const&) = delete;
X& operator=(X&&) = delete;
}
No puedo lanzar una excepción en el destructor. Estoy teniendo un error, pero no hay manera de informarlo. Y este ejemplo es bastante genérico: puedo hacerlo no solo con archivos, sino también con, por ejemplo, subprocesos, recursos gráficos, ... Observo cómo, p. la página wikipedia RAII barre todo el tema debajo de la alfombra: http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
Me parece que RAII solo es útil si se garantiza que la destrucción ocurrirá sin error. Los únicos recursos que conozco con esta propiedad es la memoria. Ahora me parece que, por ejemplo, Boehm descarta de manera convincente la idea de que la gestión manual de la memoria es una buena idea en cualquier situación común, entonces, ¿dónde está la ventaja en la forma C++ de usar RAII?
Sí, lo sé GC es un hereje poco en el mundo de C++ ;-)
¿No tiene el mismo problema en una sección 'finally' en, por ejemplo, Java? –
uno de los ejemplos que viene (no es muy relevante para su ejemplo, pero ...) son guardias de bloqueo: http://www.boost.org/doc/libs/1_48_0/doc/html/thread/synchronization.html# thread.synchronization.locks.lock_guard – Anycorn
Al hacer un uso incorrecto de los recolectores de basura para la administración general de recursos (como los identificadores de archivos), ocurre exactamente el mismo problema. ¿Dónde debería el recolector de basura arrojar excepciones? El código interesado ya pasó. – thiton