Partager via


Fonction RtlAllocateHeap (ntifs.h)

La routine RtlAllocateHeap alloue un bloc de mémoire à partir d’un tas.

Syntaxe

NTSYSAPI PVOID RtlAllocateHeap(
  [in]           PVOID  HeapHandle,
  [in, optional] ULONG  Flags,
  [in]           SIZE_T Size
);

Paramètres

[in] HeapHandle

Gérez un tas privé à partir duquel la mémoire sera allouée. Ce paramètre est un handle retourné par un appel réussi à RtlCreateHeap .

[in, optional] Flags

Aspects contrôlables de l’allocation de tas. La spécification de l’une de ces valeurs remplace la valeur correspondante spécifiée lors de la création du tas avec RtlCreateHeap. Ce paramètre peut être une ou plusieurs des valeurs suivantes.

Drapeau Signification
HEAP_GENERATE_EXCEPTIONS Le système déclenche une exception pour indiquer un échec de fonction, tel qu’une condition de mémoire insuffisante, au lieu de retourner NULL.
HEAP_NO_SERIALIZE L’exclusion mutuelle ne sera pas utilisée lorsque RtlAllocateHeap accède au tas.
HEAP_ZERO_MEMORY La mémoire allouée est initialisée à zéro. Sinon, la mémoire n’est pas initialisée à zéro.

[in] Size

Nombre d’octets à allouer. Si le tas, spécifié par le paramètre HeapHandle, est un tas non extensible, Taille doit être inférieur ou égal au seuil de mémoire virtuelle du tas. (Pour plus d’informations, consultez le membre VirtualMemoryThreshold du paramètre Parameters pour RtlCreateHeap.)

Valeur de retour

Si l’appel à RtlAllocateHeap réussit, la valeur de retour est un pointeur vers le bloc nouvellement alloué. La valeur de retour est NULL si l’allocation a échoué.

Remarques

RtlAllocateHeap alloue un bloc de mémoire de la taille spécifiée à partir du tas spécifié.

Pour libérer un bloc de mémoire alloué par RtlAllocateHeap, appelez RtlFreeHeap.

La mémoire allouée par RtlAllocateHeap n’est pas mobile. Étant donné que la mémoire n’est pas mobile, il est possible que le tas devienne fragmenté.

La sérialisation garantit l’exclusion mutuelle lorsque deux threads ou plus tentent d’allouer ou de libérer simultanément des blocs à partir du même tas. Il existe un coût de performances réduit pour la sérialisation, mais il doit être utilisé chaque fois que plusieurs threads allouent et libèrent de la mémoire à partir du même tas. La définition de la valeur HEAP_NO_SERIALIZE élimine l’exclusion mutuelle sur le tas. Sans sérialisation, deux threads ou plus qui utilisent le même handle de tas peuvent tenter d’allouer ou de libérer de la mémoire simultanément, ce qui entraîne probablement une altération dans le tas. La valeur HEAP_NO_SERIALIZE peut donc être utilisée en toute sécurité uniquement dans les situations suivantes :

  • Le processus n’a qu’un seul thread.

  • Le processus a plusieurs threads, mais un seul thread appelle les fonctions de tas pour un tas spécifique.

  • Le processus a plusieurs threads et l’application fournit son propre mécanisme d’exclusion mutuelle à un tas spécifique.

Note

Pour vous protéger contre une violation d’accès, utilisez la gestion des exceptions structurées pour protéger tout code qui écrit ou lit à partir d’un tas. Pour plus d’informations sur la gestion structurée des exceptions avec les accès en mémoire, consultez Gestion des exceptions.

Exigences

Exigence Valeur
client minimum pris en charge Windows XP
plateforme cible Universel
d’en-tête ntifs.h (include Ntifs.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Voir aussi

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap