RAII

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

RAII est l'acronyme anglais de Resource Acquisition Is Initialization, que l'on peut traduire littéralement par l'Acquisition d'une Ressource est une Initialisation. Il s'agit d'une technique de programmation utilisée dans plusieurs langages orientés objet, comme le C++, D et ADA. Cette technique, inventée par Bjarne Stroustrup[1], permet de s'assurer, lors de l'acquisition d'une ressource, que celle-ci sera bien libérée en liant cette acquisition à la durée de vie d'un objet : la ressource est acquise durant l'initialisation de l'objet, il est alors impossible de l'utiliser tant que la ressource est indisponible et elle est libérée au moment de la destruction de l'objet, cette destruction étant garantie même en cas d'erreur.

En C++, les objets résidant sur la pile sont automatiquement détruits lors de la sortie de la portée, y compris dans le cas d'une levée d'exception [2]; leur destructeur est appelé avant que l'exception ne se propage.

La technique RAII aide à l'écriture de code plus résistant aux exceptions : pour libérer une ressource avant de permettre à l'exception de se propager, on peut écrire un destructeur approprié plutôt que de disséminer et multiplier les instructions de nettoyage entre les blocs de prise en compte des exceptions.

Langages supportant la technique RAII[modifier | modifier le code]

Les langages C++ et D permettent l'allocation d'objets sur la pile et leurs règles de portée garantissent que lorsque la portée d'un objet s'achève, son destructeur est automatiquement appelé. En plaçant les instructions de libération des ressources dans le destructeur, les règles de portée du C++ et du langage D permettent l'utilisation de la technique RAII.

Cas d'utilisation[modifier | modifier le code]

La technique RAII est souvent utilisée pour contrôler les mutex des applications multithread. Dans ce cas, l'objet relâche le mutex, s'il l'avait obtenu, au moment de sa destruction. Un autre exemple type est celui de la gestion de fichier, où la classe fichier ferme le fichier associé, si celui-ci a pu être ouvert, au moment de sa destruction.

La gestion de la mémoire allouée dynamiquement (par exemple par l'utilisation de new en C++) peut être contrôlée par RAII, de telle sorte que la mémoire soit libérée quand l'objet est détruit. Suivant cette logique, La librairie standard C++ définit la classe de pointeur intelligent std::auto_ptr. D'autres types de pointeurs basés sur une sémantique d'appartenance partagée comme les pointeurs boost::shared_ptr (définis dans la librairie C++ Boost et qui sont inclus dans le nouveau standard C++11) peuvent être utilisés pour gérer la durée de vie des objets partagés.

Références[modifier | modifier le code]

  1. (en) Bjarne Stroustrup, The Design and Evolution of C++, Reading, Addison-Wesley,‎ 1994, 4e éd. (ISBN 978-0-201-54330-8, LCCN 93050758)
  2. (en) Bjarne Stroustrup, Exception Safety: Concepts and Techniques,‎ avril 2001, PDF (lire en ligne)