Fonctions de tas

Chaque processus a un tas par défaut fourni par le système. Les applications qui effectuent des allocations fréquentes à partir du tas peuvent améliorer les performances en utilisant des tas privés.

Un tas privé est un bloc d’une ou plusieurs pages dans l’espace d’adressage du processus appelant. Après avoir créé le tas privé, le processus utilise des fonctions telles que HeapAlloc et HeapFree pour gérer la mémoire dans ce tas.

Les fonctions de tas peuvent également être utilisées pour gérer la mémoire dans le tas par défaut du processus, à l’aide du handle retourné par la fonction GetProcessHeap . Les nouvelles applications doivent utiliser les fonctions de tas à la place des fonctions globales et locales à cet effet.

Il n’y a aucune différence entre la mémoire allouée à partir d’un tas privé et celle allouée à l’aide des autres fonctions d’allocation de mémoire. Pour obtenir la liste complète des fonctions, consultez le tableau dans Fonctions de gestion de la mémoire.

Notes

Un thread doit appeler les fonctions de tas uniquement pour le tas par défaut du processus et les tas privés que le thread crée et gère, à l’aide de handles retournés par la fonction GetProcessHeap ou HeapCreate .

 

La fonction HeapCreate crée un objet de tas privé à partir duquel le processus appelant peut allouer des blocs de mémoire à l’aide de la fonction HeapAlloc . HeapCreate spécifie à la fois une taille initiale et une taille maximale pour le tas. La taille initiale détermine le nombre de pages validées en lecture/écriture initialement allouées pour le tas. La taille maximale détermine le nombre total de pages réservées. Ces pages créent un bloc contigu dans l’espace d’adressage virtuel d’un processus dans lequel le tas peut croître. Les pages supplémentaires sont automatiquement validées à partir de cet espace réservé si les demandes d’HeapAlloc dépassent la taille actuelle des pages validées, en supposant que le stockage physique de celui-ci est disponible. Une fois les pages validées, elles ne sont pas décompressées tant que le processus n’est pas terminé ou que le tas est détruit en appelant la fonction HeapDestroy .

La mémoire d’un objet tas privé n’est accessible qu’au processus qui l’a créé. Si une bibliothèque de liens dynamiques (DLL) crée un tas privé, elle le fait dans l’espace d’adressage du processus qui a appelé la DLL. Il n’est accessible qu’à ce processus.

La fonction HeapAlloc alloue un nombre spécifié d’octets à partir d’un tas privé et retourne un pointeur vers le bloc alloué. Ce pointeur peut être utilisé dans les fonctions HeapFree, HeapReAlloc, HeapSize et HeapValidate .

La mémoire allouée par HeapAlloc n’est pas mobile. L’adresse retournée par HeapAlloc est valide jusqu’à ce que le bloc de mémoire soit libéré ou réalloué ; le bloc de mémoire n’a pas besoin d’être verrouillé.

Comme le système ne peut pas compacter un tas privé, il peut devenir fragmenté. Les applications qui allouent de grandes quantités de mémoire dans différentes tailles d’allocation peuvent utiliser le tas à faible fragmentation pour réduire la fragmentation du tas.

Une utilisation possible pour les fonctions tas consiste à créer un tas privé au démarrage d’un processus, en spécifiant une taille initiale suffisante pour répondre aux besoins en mémoire du processus. Si l’appel à la fonction HeapCreate échoue, le processus peut se terminer ou notifier l’utilisateur de la pénurie de mémoire ; toutefois, si elle réussit, le processus est assuré de disposer de la mémoire dont il a besoin.

La mémoire demandée par HeapCreate peut être contiguë ou non. La mémoire allouée dans un tas par HeapAlloc est contiguë. Vous ne devez pas écrire ou lire dans la mémoire dans un tas, à l’exception de celui alloué par HeapAlloc, ni supposer une relation entre deux zones de mémoire allouées par HeapAlloc.

Vous ne devez en aucun cas faire référence à la mémoire libérée par HeapFree. Une fois la mémoire libérée, toutes les informations qui ont pu y être contenues disparaissent pour toujours. Si vous avez besoin d’informations, ne libérez pas la mémoire contenant les informations. Les appels de fonction qui retournent des informations sur la mémoire (comme HeapSize) ne peuvent pas être utilisés avec de la mémoire libérée, car ils peuvent retourner des données fausses.

La fonction HeapDestroy détruit un objet de tas privé. Il désengage et libère toutes les pages de l’objet tas, et invalide le handle du tas.

Comparaison des méthodes d’allocation de mémoire