ALLOCMEM |
Alloue de la mémoire |
---|---|
Free Pascal | System |
Syntaxe
Function AllocMem(Size:PtrInt):pointer; |
Paramètres
Nom | Description |
---|---|
Size | Ce paramètre permet d'indiquer la taille de la mémoire à allouer |
Retour
Valeur | Description |
---|---|
adresse | Ces valeurs permettent d'indiquer l'emplacement du début de bloc de mémoire réservé. |
Description
Cette fonction permet d'effectuer l'allocation de mémoire dynamique de la taille spécifié dans le tas et remplit la mémoire réservé avec des valeurs 0.
Remarques
- AllocMem vs GetMem : La différence entre la fonction GetMem et AllocMem réside dans le fait que la fonction GetMem ne remplit pas de valeur 0 le bloc de mémoire alloué avant de lui en donner l'accès. De ce fait, elle est donc légèrement plus lente que GetMem car elle effectue un traitement de plus.
- Allocation et Initialisation de la Mémoire : La fonction AllocMem alloue un bloc de mémoire dynamique de la taille spécifiée et l'initialise à zéro. Contrairement à GetMem, qui ne garantit pas l'initialisation des octets alloués, AllocMem évite d'avoir des valeurs indéfinies, ce qui peut prévenir des comportements imprévisibles.
- Retour d'un pointeur typé : AllocMem retourne un pointeur générique (Pointer), ce qui signifie qu'il doit être casté vers un type de pointeur spécifique pour être utilisé efficacement. Cela le rend flexible, mais impose à l'utilisateur de connaître précisément la structure des données manipulées.
- Utilisation Conjointe avec FreeMem : Toute mémoire allouée avec AllocMem doit être libérée avec FreeMem pour éviter des fuites de mémoire. Oublier de libérer la mémoire peut entraîner une augmentation progressive de l'utilisation de la RAM et, dans les cas extrêmes, provoquer un crash du programme.
- Différence avec New : Contrairement à New, allouant et initialise des objets ou enregistrements spécifiques, AllocMem fonctionne avec des blocs de mémoire brute. Il est donc plus adapté pour gérer des structures complexes ou des tableaux dynamiques nécessitant une allocation manuelle.
- Utilisation dans les programmes multiplateformes : AllocMem étant défini dans l'unité System, il est disponible sur toutes les plateformes supportées par Free Pascal. Il garantit un comportement cohérent quel que soit le système d'exploitation, contrairement à certaines API système spécifiques comme malloc sous C.
- Performance et Impact sur la Gestion Mémoire : Étant donné que AllocMem remplit la mémoire allouée avec des zéros, son exécution peut être légèrement plus lente que GetMem, surtout pour de grandes allocations. Toutefois, cette initialisation peut éviter des erreurs difficiles à détecter liées à l'utilisation de données non initialisées.
- Allocation de tableaux dynamiques : AllocMem peut être utilisé pour allouer des tableaux dynamiques manuellement, bien que Free Pascal fournisse déjà des mécanismes intégrés comme SetLength. L'intérêt d'utiliser AllocMem réside dans le contrôle précis de l'allocation et de la structure mémoire.
- Précautions avec les types référencés : Lorsqu'on utilise AllocMem pour allouer des enregistrements contenant des chaînes de caractères ou des objets, il faut faire attention, car les champs référencés ne sont pas automatiquement initialisés comme avec New. Il est donc nécessaire d'initialiser explicitement les champs avant utilisation.
Exemple
Voici quelques exemples typiques de l'utilisation de la fonction «AllocMem» en Free Pascal :

- Program AllocMemSamples;
-
- Type
- TInteger = Array[0..20] of Integer;
-
- Var
- P:^TInteger;
- I:Integer;
-
- BEGIN
- P := AllocMem(20 * SizeOf(Integer));
- If NIL <> P Then Begin
- For I := 0 to 19 do P^[I] := 1000-(I * 10);
- WriteLn('Valeur P^[15] = ',P^[15]);
- FreeMem(P,20 * SizeOf(Integer));
- End
- Else
- Begin
- WriteLn('Impossible d''allouer de la mémoire dynamiquement !');
- End;
- END.
on obtiendra le résultat suivant :
Valeur p[15] = 850Voir également
Gladir.com - Langage de programmation - Free Pascal - Référence de procédures et fonctions - «GETMEM»
Gladir.com - Langage de programmation - Free Pascal - Référence de procédures et fonctions - «NEW»
Dernière mise à jour : Samedi, le 18 juillet 2015