Pattern de destructeur
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 13 sur 61.
Tout objet créé avec malloc doit finalement être libéré. Tout comme nous avons écrit une fonction create_ pour gérer l’allocation, nous écrivons une fonction free_ pour gérer le nettoyage. C’est le modèle du destructeur.
L’idée essentielle est que la libération doit s’effectuer dans l’ordre inverse de l’allocation. Si votre constructeur a d’abord alloué les membres internes, puis la structure elle-même, votre destructeur doit d’abord libérer les membres de la structure, puis la structure :
typedef struct {
char *name;
int age;
} Person;
void free_person(Person *p) {
if (p == NULL) return; // Vérification de sécurité
free(p->name); // Libérer d'abord le membre interne
free(p); // Puis libérer la structure elle-même
}
La vérification de NULL au début empêche les plantages si quelqu’un transmet accidentellement un pointeur non valide. Après avoir libéré la chaîne name interne, nous libérons la structure elle-même. Si nous libérions p en premier, nous perdrions l’accès à p->name et provoquerions une fuite de mémoire.
Utiliser le destructeur est simple :
Person *alice = create_person("Alice", 30);
// ... utilisez alice ...
free_person(alice); // Nettoyer une fois terminé
Ce modèle garantit que toute la mémoire est correctement libérée. Sans lui, chaque objet que vous créez provoquerait une fuite de mémoire jusqu’à ce que votre programme n’en ait plus.
Défi
FacileConstruisons un module Movie qui illustre le cycle de vie complet d’un objet : sa création et sa destruction. Tu vas t’exercer à écrire une fonction destructrice qui libère correctement toute la mémoire allouée dans le bon ordre.
Tu vas créer trois fichiers :
movie.h: Déclarer une structureMovieavec deux membres :char *title(une chaîne allouée dynamiquement) etint year. Déclarer à la fois un constructeurcreate_moviequi prend un titre et une année, et un destructeurfree_moviequi prend un pointeur vers un Movie. Utiliser des gardes d’inclusion avec le symboleMOVIE_H.movie.c: Implémenter les deux fonctions. Ton constructeur doit allouer de la mémoire pour la structure et pour sa chaîne de titre (n’oublie pas le caractère nul terminal). Ton destructeur doit libérer la mémoire dans l’ordre inverse de l’allocation : d’abord la chaîne internetitle, puis la structure elle-même. Ajouter une vérification de NULL au début de ton destructeur par sécurité.main.c: Créer un film, afficher ses informations, puis libérer correctement la mémoire.
Tu recevras deux entrées : le titre du film (une chaîne) et l’année de sortie (un entier).
Dans ton fichier principal, utilise create_movie pour créer un nouveau film, affiche ses informations, puis appelle free_movie pour libérer toute la mémoire. Après la libération, affiche un message de confirmation.
Affiche la sortie dans ce format :
Movie: {title} ({year})
Memory freedPar exemple, avec les entrées Inception et 2010, la sortie serait :
Movie: Inception (2010)
Memory freedSouviens-toi : la clé d’un destructeur correct est de libérer dans l’ordre inverse. Ce que ton constructeur alloue en premier est libéré en dernier, et ce qu’il alloue en dernier est libéré en premier.
Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
#include "movie.h"
int main() {
char title[100];
int year;
// Lire l'entrée
scanf("%[^\n]", title);
scanf("%d", &year);
// TODO: Créer un film en utilisant create_movie
// TODO: Afficher les informations du film au format :
// Film : {title} ({year})
// TODO: Libérer le film en utilisant free_movie
// TODO: Afficher "Memory freed"
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne