Raccordements d'allocation et allocations de la mémoire runtime C
Une restriction très importante s'applique aux fonctions de raccordement d'allocation : elles doivent ignorer de façon explicite les blocs _CRT_BLOCK (les allocations de mémoire effectuées en interne par les fonctions de la bibliothèque Runtime C) si elles passent des appels aux fonctions de la bibliothèque Runtime C qui allouent la mémoire interne.Vous pouvez ignorer les blocs _CRT_BLOCK en incluant un code, tel que le suivant au début de votre fonction de raccordement d'allocation :
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
Si votre raccordement d'allocation n'ignore pas les blocs _CRT_BLOCK, toute fonction de la bibliothèque Runtime C appelée dans votre raccordement peut interrompre le programme dans une boucle sans fin.Par exemple, printf effectue une allocation interne.Si votre code de raccordement appelle printf, l'allocation résultante déclenchera un nouvel appel à votre raccordement, lequel rappellera printf, et ainsi de suite jusqu'à ce qu'un dépassement de capacité de la pile se produise.Si vous avez besoin de reporter les opérations d'allocation de _CRT_BLOCK, un moyen de contourner cette restriction consiste à utiliser pour la mise en forme et la sortie les fonctions API Windows, plutôt que les fonctions Runtime C.Étant donné que les API Windows n'utilisent pas le tas de la bibliothèque Runtime C, elles n'interrompront pas votre raccordement d'allocation dans une boucle sans fin.
Si vous examinez les fichiers sources de la bibliothèque Runtime, vous verrez que la fonction de raccordement d'allocation par défaut, à savoir CrtDefaultAllocHook (qui renvoie simplement TRUE), se trouve dans un fichier distinct, à savoir DBGHOOK.C.Si vous voulez que votre raccordement d'allocation soit appelé même pour les allocations effectuées par le code de démarrage runtime exécuté avant la fonction main de votre application, vous pouvez remplacer cette fonction par défaut par une fonction à vous, plutôt que d'utiliser _CrtSetAllocHook.