Constructeurs et destructeurs

Classe, instance de classe, constructeur, destructeur

L’exemple ci-dessus contient TAnimal et sa sous-classe TDog. Une classe n’est qu’un type, comparable à un modèle ; la classe elle-même ne stocke aucune donnée et aucune mémoire n’est allouée pour le champ MyInt: Integer de l’exemple.

Même si des variables de classe permettent à la classe de conserver des données, nous n’abordons pas ce point ici et ne traitons que les classes classiques à champs ordinaires.

Pour allouer de la mémoire aux champs, il faut créer une instance de classe ; créer une instance implique d’appeler un constructeur.

Si vous ne créez jamais d’instance d’une classe, son code est comme inexistant : il ne s’exécute pas et aucune mémoire n’est réservée pour ses variables. On peut assimiler une classe à un moule : la mémoire n’est allouée que lorsqu’on l’utilise, sinon elle reste inactive sans consommer de ressources.

Constructeur

  • Méthode spéciale déclarée avec le mot-clé constructor ;
  • Le système alloue d’abord la mémoire de l’objet avant d’exécuter le code du constructeur ;
  • Toutes les classes héritent implicitement de TObject et possèdent un constructeur sans paramètres Create, utilisable sans définition manuelle ;
  • Les constructeurs personnalisés sont le meilleur moyen d’initialiser des objets, ils permettent d’affecter des valeurs initiales aux champs ;
  • Les constructeurs personnalisés portent conventionnellement le nom Create.

Exemple

program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;

type
  TAnimal = class
  private
    InternalStuff: TObject;
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TAnimal.Create;
begin
  inherited Create; // Appel du constructeur parent en premier
  InternalStuff := TObject.Create;
  Writeln('Exécution du constructeur TAnimal.Create');
end;

destructor TAnimal.Destroy;
begin
  Writeln('Exécution du destructeur TAnimal.Destroy');
  FreeAndNil(InternalStuff); // Libération du sous-objet interne
  inherited Destroy; // Appel du destructeur parent à la fin
end;

var
  C: TAnimal;
begin
  C := TAnimal.Create;
  try
    // Utilisation de l'objet
  finally
    FreeAndNil(C); // Appel automatique du destructeur Destroy
  end;
end.

Résultat d’exécution

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
38 lines compiled, 0.1 sec, 68672 bytes code, 4260 bytes data

D:\fpcdemo>mydemo
Exécution du constructeur TMyClass.Create
Exécution du destructeur TMyClass.DestroyLangage du code : CSS (css)

InternalStuff est un sous-objet détenu en interne par la classe. Il est instancié dans le constructeur et doit être libéré via FreeAndNil dans le destructeur pour éviter les fuites de mémoire.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *