Destructeurs et nettoyage
Libérer automatiquement les ressources
Destructeurs et nettoyage est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Le rôle d'un destructeur
Un destructeur s'exécute lorsque la durée de vie d'un objet s'achève. Son rôle est de libérer tout ce que l'objet possède. Il est nommé ~ClassName.
#include <iostream>
class File {
public:
~File() { std::cout << "closing file\n"; }
};
int main() {
File f;
} // ~File runs hereLibérer la mémoire possédée
Si une classe possède de la mémoire du tas, son destructeur doit la libérer. C'est l'endroit classique où appeler delete.
#include <iostream>
class Buffer {
int* data;
public:
Buffer(int n) : data(new int[n]) {}
~Buffer() { delete[] data; } // cleanup
};
int main() { Buffer b(10); }Les destructeurs s'exécutent automatiquement
Vous n'appelez pas vous-même les destructeurs des objets de la pile : le compilateur insère l'appel à la fin de la portée.
Ordre inverse des membres
Les objets membres sont détruits dans l'ordre inverse de leur déclaration, après l'exécution du corps du destructeur.
#include <iostream>
struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
A a;
B b; // destroyed before a
~C() { std::cout << "~C\n"; }
};
int main() { C c; }Destructeurs virtuels
Si vous supprimez un objet dérivé via un pointeur de base, le destructeur de base doit être virtual ; sinon, la partie dérivée fuit.
#include <iostream>
struct Base {
virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
~Derived() override { std::cout << "~Derived\n"; }
};
int main() {
Base* p = new Derived();
delete p; // both run thanks to virtual
}Les destructeurs ne doivent pas lever d'exception
Lever une exception depuis un destructeur pendant la remontée de la pile termine le programme. Les destructeurs doivent être marqués (implicitement) noexcept et ne jamais laisser une exception s'échapper.
Le destructeur par défaut
Si vous n'en écrivez aucun, le compilateur génère un destructeur qui détruit chaque membre. Pour les classes composées uniquement de membres RAII, c'est exactement ce qu'il faut.
#include <string>
#include <vector>
struct Record {
std::string name; // self-cleaning
std::vector<int> values; // self-cleaning
}; // default destructor is enoughDestructeur = default
Écrivez ~Class() = default; pour demander explicitement celui qui est généré par le compilateur, ce qui est utile lorsque vous avez besoin d'un destructeur virtuel, mais d'aucune logique personnalisée.
#include <iostream>
struct Shape {
virtual ~Shape() = default; // virtual + default
};Libérer les ressources autres que la mémoire
Les destructeurs ferment aussi les fichiers, libèrent les verrous et déconnectent les sockets : ils ne servent pas uniquement à libérer la mémoire. Toute ressource acquise doit être gérée ici.
Ordre entre les objets
Les variables locales multiples sont détruites dans l'ordre inverse de leur construction ; un destructeur peut donc utiliser sans risque les objets créés avant lui.
Laissez les membres RAII faire le travail
Si chaque membre est un type RAII, vous n'avez souvent besoin d'aucun destructeur personnalisé. Réservez les destructeurs écrits manuellement aux ressources brutes.
Vérification rapide
Testez votre compréhension des destructeurs.
Récapitulatif
Vous avez appris que les destructeurs libèrent automatiquement les ressources possédées à la fin de leur durée de vie, détruisent les membres dans l'ordre inverse de leur déclaration, ne doivent pas lever d'exception et doivent être virtual dans les classes de base polymorphiques. Les membres RAII rendent souvent les destructeurs personnalisés inutiles.
Questions Fréquemment Posées
La leçon « Destructeurs et nettoyage » est-elle gratuite ?
Oui — le texte complet de « Destructeurs et nettoyage » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Destructeurs et nettoyage » ?
Libérer automatiquement les ressources Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Destructeurs et nettoyage » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Le principe RAII
- Destructeurs et nettoyage
- Règle des trois et des cinq
- Gardes de portée