C++ moderne et alternatives en C

RAII et la libération automatique des ressources en C++

Dans cette leçon, vous allez comparer la fermeture sûre d'un fichier en C avec la technique RAII du C++, où les ressources sont libérées automatiquement.

Introduction

RAII (Resource Acquisition Is Initialization) est une technique qui lie la durée de vie d'une ressource, comme un fichier, une zone mémoire ou une connexion, à la durée de vie d'un objet. Quand l'objet est détruit, la ressource est libérée automatiquement quelle que soit la façon de sortir du bloc, même si une exception survient.

Points importants

  • Comprenez comment on fait en C avant d'apprendre les abstractions du C++.
  • Exprimez la possession des ressources avec RAII et la sémantique de valeur (value semantics).
  • Préférez les outils sûrs du point de vue des types du C++ aux macros et aux conversions de type.

Exemples de code C et C++

C
Exécuter →
main.c
#include <stdio.h>

int main(void) {
    int result = 1;
    FILE *file = fopen("scores.txt", "w");
    if (!file) goto cleanup;
    if (fputs("Ada 95\n", file) < 0) goto cleanup;
    result = 0;

cleanup:
    if (file) fclose(file);
    puts(result ? "failed" : "saved");
    return result;
}
Résultat de l’exécution
saved
C++
Exécuter →
main.cpp
#include <fstream>
#include <iostream>

int main() {
    std::ofstream file("scores.txt");
    if (!file) return 1;
    file << "Ada 95\n";
    std::cout << "saved\n";
}
Résultat de l’exécution
saved

Comparaison entre C et C++

En C, le programme utilise l'étiquette cleanup et l'instruction goto pour que tous les chemins, en cas de succès comme d'erreur, passent par le fclose qui ferme le fichier. En C++, std::ofstream ferme le fichier dans son destructeur (destructor) quand la variable file sort de sa portée. La gestion des ressources est ainsi plus propre et le risque d'oublier de les libérer diminue.

C

C utilise des conventions de nommage, des callbacks, des macros et des struct de contexte.

C++

C++ offre des abstractions à la portée bien délimitée, sûres pour les types et généralement sans coût supplémentaire à l'exécution.

Exercices d'approfondissement

Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.

  • Écrivez d'abord le mécanisme en C, puis utilisez la fonctionnalité équivalente du C++.
  • Remplacez la libération manuelle des ressources par RAII.
  • Vérifiez si la fonctionnalité provoque des allocations mémoire ou des appels de fonctions virtuelles.

S'entraîner avec un défi

Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.

Tous les défis