Partager via


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 à l’aide de segments de mémoire 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 au lieu des fonctions globales et locales à cet effet.

Il n’existe 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.

Note

Un thread doit appeler des fonctions de tas uniquement pour les segments de mémoire et les segments privés par défaut que le thread crée et gère, à l’aide de handles retournés par les GetProcessHeap ou fonction 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 une taille initiale et une taille maximale pour le tas. La taille initiale détermine le nombre de pages validées et 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. Des pages supplémentaires sont automatiquement validées à partir de cet espace réservé si les requêtes par HeapAlloc dépassent la taille actuelle des pages validées, en supposant que le stockage physique pour celui-ci est disponible. Une fois les pages validées, elles ne sont pas validées tant que le processus n’est pas terminé ou que le tas n’est pas détruit en appelant la fonction HeapDestroy.

La mémoire d’un objet tas privé est accessible uniquement 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 leHeapFree, HeapReAlloc, HeapSizeet fonctions 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éaffecté ; le bloc de mémoire n’a pas besoin d’être verrouillé.

Étant donné que 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 de 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 arrêter ou avertir l’utilisateur de la pénurie de mémoire ; toutefois, si elle réussit, le processus est assuré d’avoir la mémoire dont il a besoin.

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

Vous ne devez pas faire référence à la mémoire qui a été libérée par HeapFree. Une fois la mémoire libérée, toutes les informations qui auraient pu y être contenues sont toujours passées. Si vous avez besoin d’informations, ne libérez pas de mémoire contenant les informations. Les appels de fonction qui retournent des informations sur la mémoire (telles que tasSize) peuvent ne pas être utilisés avec de la mémoire libérée, car ils peuvent retourner des données factices.

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

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