ProgrammationDéveloppeur C++

Parlez-moi de la façon dont RAII et les exceptions fonctionnent en C++ ? Pourquoi est-il important de gérer correctement les ressources ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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.

Exemple de code :

#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.

Question piège.

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.

Exemple :

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 !

Exemples d'erreurs réelles dues à la méconnaissance des subtilités du sujet.


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.