encapsulent chaque ressource dans une classe qui les efface dans son destructor (avec un essai entourant/catch):
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;
}
A shared_ptr
avec une coutume Deleter est un moyen d'y parvenir sans avoir à créer une classe entière pour chaque type de ressource.
Vous pouvez améliorer l'élimination de l'exception (consigner le problème, par exemple), en fonction de ce qui est levé.
Encore mieux, modifiez les ressources A, B et C pour qu'elles se libèrent elles-mêmes de leurs propres destructeurs. Cela pourrait ne pas être possible, cependant. Dans les deux cas, vous pouvez placer autant de ressources de ce type dans une seule classe que vous le souhaitez, sans ajouter de code au destructeur de la classe. C'est "scalabilité". Tout le point de RAII, est que chaque utilisateur d'une ressource ne devrait pas avoir à écrire du code de nettoyage afin d'utiliser la ressource correctement.
Il est * définitivement * non évolutif. En essayant de gérer seulement trois ressources, vous avez déjà des erreurs de logique. – nobar