RAII: l'Acquisition de Ressources Est d'Initialisation
RAII peut-être le plus important de l'idiome. C'est l'idée que les ressources doivent être mappés aux objets, ainsi que leurs durées de vie sont gérées automatiquement, en fonction du cadre dans lequel ces objets sont déclarés.
Par exemple, si un descripteur de fichier a été déclaré sur la pile, il doit être fermé implicitement une fois que nous retournons à partir de la fonction (ou d'une boucle, ou n'importe quel champ d'action qu'elle a été déclarée à l'intérieur). Si une allocation dynamique de la mémoire a été allouée en tant que membre d'une classe, il doit être implicitement libérée une fois que l'instance de classe est détruit. Et ainsi de suite. Tous les types de ressources les allocations de mémoire, les descripteurs de fichiers, de connexions de base de données, prises de courant, et tout autre type de ressource qui doit être acquis et mis en liberté—doit être appliqué à l'intérieur d'un tel RAII de classe, dont la durée de vie est déterminée par le champ d'application dans lequel elle a été déclarée.
Un grand avantage de ceci est que le C++ garantit que les destructeurs sont appelés lorsqu'un objet est hors de portée, indépendamment de la façon dont le contrôle est laisser ce champ d'application. Même si une exception est levée, tous les objets hors de portée, et donc leurs ressources associées seront nettoyés.
void foo() {
std::fstream file("bar.txt"); // open a file "bar.txt"
if (rand() % 2) {
// if this exception is thrown, we leave the function, and so
// file's destructor is called, which closes the file handle.
throw std::exception();
}
// if the exception is not called, we leave the function normally, and so
// again, file's destructor is called, which closes the file handle.
}
Indépendamment de la façon dont nous quitter la fonction, et de ce qui se passe une fois le fichier ouvert, nous n'avons pas besoin de fermer explicitement le fichier, ou de gérer les exceptions (par exemple, essayez-enfin) à l'intérieur de cette fonction. Au lieu de cela, le fichier est nettoyée, car il est attaché à un objet local est détruit quand elle est hors de portée.
RAII est également moins communément connu comme SBRM (Champ d'application Lié à la Gestion des Ressources).
Voir aussi:
-
ScopeGuard permet code pour "appeler automatiquement un 'annuler'. dans le cas où une exception est levée."