Si il est un point délicat dans la programmation sous DOS, c'est bien celui-ci. Car même si les
ordinateurs modernes possèdent parfois jusqu'à plusieurs Giga-octets de mémoire, DOS n'a été conçu
que pour en utiliser un Méga-octet seulement. Et à l'intérieur de ce méga-octet, une partie définie
est réservée pour le fonctionnement interne de DOS, il ne reste donc que 640 Ko de mémoire dynamique
pour que les programmes puissent s'exécuter correctement.
Mémoire dynamique oui, car il existe pour
un programme deux types de mémoire : la mémoire statique, où sont stockées toutes les variables qui
ont été déclarées lors de la compilation, et la mémoire dynamique, qui permet donc de définir des
variables créées lors de l'exécution du programme. L'avantage de la mémoire dynamique, par rapport à
la mémoire statique, est qu'elle permet d'adapter la zone de mémoire utilisée au programme qui
s'exécute : en effet, on pourra par exemple créer en mémoire une zone spéciale qui ne pourrait servir
qu'à un traitement ponctuel, mais dont la taille ne pourrait contenir dans un segment de
64 kilo-octets. Car 64 kilo-octets est la limite pour la taille d'une variable en mémoire statique,
cette limite n'existant pas pour la mémoire dynamique, qui permet d'allouer de plus grands espaces.
Malheureusement, la taille de ma mémoire dynamique est fixe, soit 640 kilo-octets, ce qui peut
parfois entraîner des désagréments lors de l'exécution (des erreurs se produisent lorsqu'ils n'y a
plus d'espace mémoire disponible mais ceci reste relativement rare). Pour contrer cette contrainte
peu réjouissante, l'objectif est de gérer correctement nos moyens pour réserver et libérer des
espaces en mémoire dynamique.
Cette gestion passe par les pointeurs : les pointeurs sont des
variables pouvant être statiques ou dynamiques (stockées sur quatre octets) qui représentent un lien vers
un espace de la mémoire dynamique. Il existe donc au minimum un petit espace de quatre octets
réservés en mémoire et représentant un lien vers une zone de mémoire dynamique. Pour allouer et
libérer de l'espace, nous disposons de deux couples d'instructions : GetMem/FreeMem et
New/Dispose.
La première paire permet, à partir d'un pointeur donné, de réserver ou libérer un
espace en mémoire dynamique : la taille de l'espace à allouer ou libérer est cependant spécifiée, ce
qui permet par exemple de créer des zones de mémoire tampon pour le traitement spécifique de données.
Le second jeu d'instructions permet plus spécifiquement de réserver des zones destinées à contenir
des éléments précis, comme par exemple des enregistrements ou des objets. La taille n'est alors pas
passée en paramètre, et le compilateur alloue ou libère la zone concernée avec la taille qu'il aura
définie. Ceci s'utilise généralement avec les pointeurs sur enregistrements ou les pointeurs sur
objets : le programmeur évite donc de se soucier de la taille d'un enregistrement ou d'un objet.
Les nouvelles versions des instructions new et dispose permettent également de passer en paramètre
des méthodes spéciales, appelées constructeurs et destructeurs, ce qui facilite grandement la tâche
du programmeur (ceci sera abordé lors des exercices sur les objets).
|