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

Handle pour 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 du 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 prendre une ou plusieurs des valeurs suivantes.

Indicateur Signification
HEAP_GENERATE_EXCEPTIONS Le système déclenche une exception pour indiquer une défaillance de fonction, telle 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, la taille doit être inférieure ou égale au seuil de mémoire virtuelle du tas. (Pour plus d’informations, consultez le membre VirtualMemoryThreshold du paramètre Parameters sur RtlCreateHeap.)

Valeur retournée

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 se fragmente.

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 faible coût de performances pour la sérialisation, mais il doit être utilisé chaque fois que plusieurs threads allouent et libèrent de la mémoire 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 risque d’endommager 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 comporte plusieurs threads, mais un seul thread appelle les fonctions de tas pour un tas spécifique.

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

Notes

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

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP
Plateforme cible Universal
En-tête ntifs.h (inclure Ntifs.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Voir aussi

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap