RAII (Resource Acquisition Is Initialization) — est une idiome en C++ qui permet de gérer la durée de vie des ressources (fichiers, mémoire, sockets, etc.) à travers la durée de vie des objets. Les ressources sont allouées dans le constructeur de l'objet et libérées dans le destructeur.
#include <fstream> void save_data(const std::string& filename, const std::string& data) { std::ofstream file(filename); // RAII : le fichier se fermera automatiquement if (!file) throw std::runtime_error("Impossible d'ouvrir le fichier"); file << data; } // le fichier se fermera ici
En cas d'exception, le destructeur sera tout de même appelé et les ressources ne seront pas perdues. Si RAII n'est pas utilisé, il est possible de rencontrer des fuites de mémoire et des descripteurs de fichiers.
Peut-on garantir l'absence de fuites de mémoire en C++, en utilisant uniquement try/catch ?
Non, ce n'est pas possible. L'utilisation simple de try/catch ne garantit pas la libération des ressources. Seul RAII peut garantir cela.
int* arr = new int[10]; try { // Traitement avec arr throw std::runtime_error("Oups"); } catch (...) { // arr n'est pas libéré, si delete[] n'a pas été appelé } // arr fuit !
Histoire
Dans un grand projet graphique, des plantages se produisaient périodiquement à cause de l'épuisement des descripteurs de fichiers. Il s'est avéré que les fichiers étaient ouverts dans une fonction sans enveloppe RAII (std::fstream), et lors du lancement d'une exception, les ressources n'étaient pas libérées.
Histoire
Dans le gestionnaire de requêtes d'un serveur web, de la mémoire brute était utilisée sans enveloppe dans un smart-pointer – en cas de lancement d'une exception, la mémoire n'était pas libérée, ce qui entraînait une dégradation des performances et des plantages.
Histoire
Dans un projet de traitement d'images, des fichiers temporaires étaient créés sans être enveloppés par des objets. Lors du lancement d'exceptions, les fichiers n'étaient pas supprimés, entraînant le débordement de /tmp sur le serveur après plusieurs mois de fonctionnement continu.