incapsulare ogni risorsa in una classe che li cancella nel suo distruttore (con un try/catch circostante):
struct ProperlyManagedA {
// some means of using the resource - a rudimentary way is this:
A &getA() { return a; }
const A &getA() const { return a; }
// cleanup
~ProperlyManagedA() {
try {
a.clear(); // whatever it is ClearResourceA actually does
} catch (...) {}
}
private:
A a;
}
Un shared_ptr
con un costume deleter è un modo per ottenere ciò senza dover creare un'intera classe per ogni tipo di risorsa.
È possibile migliorare lo scartamento dell'eccezione (ad esempio, registrare il problema), a seconda di ciò che viene generato.
Ancora meglio, modificare le risorse A, B e C in modo che si cancellino nei propri distruttori. Questo potrebbe non essere possibile, però.
In entrambi i casi, è possibile inserire tutte le risorse in una singola classe come desiderato, senza aggiungere alcun codice al distruttore della classe. Questa è "scalabilità". L'intero punto di RAII è che ogni utente di una risorsa non dovrebbe dover scrivere il codice di pulizia per utilizzare correttamente la risorsa.
fonte
2010-10-14 14:52:34
È * decisamente * non scalabile. Cercando di gestire solo tre risorse, hai già errori logici. – nobar