Pascal - Gestion de la mémoire

Ce chapitre explique la gestion dynamique de la mémoire dans Pascal. Le langage de programmation Pascal fournit plusieurs fonctions pour l'allocation et la gestion de la mémoire.

Allocation dynamique de la mémoire

Lors de la programmation, si vous connaissez la taille d'un tableau, c'est facile et vous pouvez le définir comme un tableau. Par exemple, pour stocker le nom de n'importe quelle personne, il peut comporter au maximum 100 caractères afin que vous puissiez définir quelque chose comme suit -

var
name: array[1..100] of char;

Mais maintenant, considérons une situation dans laquelle vous n'avez aucune idée de la longueur du texte que vous devez stocker, par exemple, vous souhaitez stocker une description détaillée d'un sujet. Ici, nous devons définir un pointeur vers une chaîne sans définir la quantité de mémoire requise.

Pascal fournit une procédure newpour créer des variables de pointeur.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   new(description);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Maintenant, si vous avez besoin de définir un pointeur avec un nombre spécifique d'octets pour y être référencé plus tard, vous devez utiliser le getmem fonction ou le getmem procédure, qui a la syntaxe suivante -

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

Dans l'exemple précédent, nous avons déclaré un pointeur vers une chaîne. Une chaîne a une valeur maximale de 255 octets. Si vous n'avez vraiment pas besoin de beaucoup d'espace, ou d'un espace plus grand, en termes d'octets, le sous-programme getmem permet de le spécifier. Réécrivons l' exemple précédent, en utilisant getmem -

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   description := getmem(200);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Ainsi, vous avez un contrôle total et vous pouvez transmettre n'importe quelle valeur de taille tout en allouant de la mémoire contrairement aux tableaux, où une fois que vous avez défini la taille ne peut pas être modifiée.

Redimensionner et libérer la mémoire

Lorsque votre programme sort, le système d'exploitation libère automatiquement toute la mémoire allouée par votre programme, mais comme une bonne pratique lorsque vous n'avez plus besoin de mémoire, vous devez libérer cette mémoire.

Pascal fournit la procédure dispose pour libérer une variable créée dynamiquement à l'aide de la procédure new. Si vous avez alloué de la mémoire à l'aide du getmem sous-programme, alors vous devez utiliser le sous-programme freemempour libérer cette mémoire. Les sous-programmes freemem ont la syntaxe suivante -

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

Vous pouvez également augmenter ou diminuer la taille d'un bloc de mémoire alloué en appelant la fonction ReAllocMem . Vérifions à nouveau le programme ci-dessus et utilisons les sous-programmes ReAllocMem et freemem . Voici la syntaxe de ReAllocMem -

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

Voici un exemple qui utilise les sous-programmes ReAllocMem et freemem -

program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;

begin
   name:= 'Zara Ali';
   desp := 'Zara ali a DPS student.';
   
   description := getmem(30);
      if not assigned(description) then
         writeln('Error - unable to allocate required memory')
      else
         description^ := desp;

   (* Suppose you want to store bigger description *)
   description := reallocmem(description, 100);
   desp := desp + ' She is in class 10th.';
   description^:= desp; 
   
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

Fonctions de gestion de la mémoire

Pascal fournit un tas de fonctions de gestion de la mémoire qui sont utilisées dans l'implémentation de diverses structures de données et l'implémentation de la programmation de bas niveau en Pascal. Beaucoup de ces fonctions dépendent de l'implémentation. Free Pascal fournit les fonctions et procédures suivantes pour la gestion de la mémoire -

SN Nom de la fonction et description
1

function Addr(X: TAnytype):Pointer;

Renvoie l'adresse de la variable

2

function Assigned(P: Pointer):Boolean;

Vérifie si un pointeur est valide

3

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

sept

function Cseg: Word;

Renvoie le segment de code

8

procedure Dispose(P: Pointer);

Libère la mémoire allouée dynamiquement

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

Libère la mémoire allouée dynamiquement

dix

function Dseg: Word;

Renvoie le segment de données

11

procedure FillByte(var x; count: SizeInt; value: Byte);

Remplit la région mémoire avec un motif 8 bits

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

Remplit la région mémoire avec un certain caractère

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

Remplit la région mémoire avec un motif 32 bits

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

Remplit la région mémoire avec un modèle 64 bits

15 procedure FillWord( var x; count: SizeInt; Value: Word);

Remplit la région mémoire avec un motif 16 bits

16

procedure Freemem( p: pointer; Size: PtrUInt);

Libère la mémoire allouée

17

procedure Freemem( p: pointer );

Libère la mémoire allouée

18

procedure Getmem( out p: pointer; Size: PtrUInt);

Alloue une nouvelle mémoire

19

procedure Getmem( out p: pointer);

Alloue une nouvelle mémoire

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

Renvoie le gestionnaire de mémoire actuel

21

function High( Arg: TypeOrVariable):TOrdinal;

Renvoie l'indice le plus élevé du tableau ouvert ou énuméré

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

Recherche une valeur de la taille d'un octet dans une plage de mémoire

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

Recherche une valeur de la taille d'un caractère dans une plage de mémoire

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

Recherche une valeur DWord (32 bits) dans une plage de mémoire

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

Recherche une valeur de taille QWord dans une plage de mémoire

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

Recherche une valeur de la taille d'un mot dans une plage de mémoire

27

function IsMemoryManagerSet: Boolean;

Le gestionnaire de mémoire est-il défini

28

function Low( Arg: TypeOrVariable ):TOrdinal;

Renvoie l'indice le plus bas du tableau ouvert ou énuméré

29

procedure Move( const source; var dest; count: SizeInt );

Déplace les données d'un emplacement de la mémoire à un autre

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

Déplace les données jusqu'au premier caractère zéro

31

procedure New( var P: Pointer);

Allouer dynamiquement de la mémoire pour la variable

32

procedure New( var P: Pointer; Cons: TProcedure);

Alloue dynamiquement de la mémoire pour la variable

33

function Ofs( var X ):LongInt;

Renvoie le décalage de la variable

34

function ptr( sel: LongInt; off: LongInt):farpointer;

Combine le segment et le décalage avec le pointeur

35

function ReAllocMem( var p: pointer; Size: PtrUInt):pointer;

Redimensionne un bloc de mémoire sur le tas

36

function Seg( var X):LongInt;

Renvoie le segment

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

Définit un gestionnaire de mémoire

38

function Sptr: Pointer;

Renvoie le pointeur de pile actuel

39

function Sseg: Word;

Renvoie la valeur du registre du segment de pile