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 |