Types de bloc sur le tas de débogage
Cette rubrique s'applique à :
Édition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
![]() |
![]() |
![]() |
Natif uniquement |
![]() |
Pro, Premium et Ultimate |
![]() |
![]() |
![]() |
Natif uniquement |
![]() |
Chaque bloc de mémoire dans le tas de débogage est assigné à l'un des cinq types d'allocations. Ces types sont suivis et reportés différemment pour la détection des fuites et la création de rapports d'état. Vous pouvez spécifier un type de bloc en l'allouant avec un appel direct à l'une des fonctions d'allocation du tas de débogage, telles que _malloc_dbg. Les cinq types de bloc de mémoire dans le tas de débogage (défini dans le membre nBlockUse de la structure _CrtMemBlockHeader) sont les suivants :
_NORMAL_BLOCK
Un appel à malloc ou à calloc crée un bloc Normal. Si vous avez l'intention d'utiliser uniquement des blocs Normal et n'avez pas besoin de blocs Client, vous pouvez définir _CRTDBG_MAP_ALLOC, qui provoque le mappage de tous les appels d'allocation du tas sur leurs équivalents de débogage dans les versions Debug. Cela permettra de stocker le nom de fichier et le numéro de ligne relatifs à chaque appel d'allocation dans l'en-tête du bloc correspondant._CRT_BLOCK
Les blocs de mémoire alloués en interne par de nombreuses fonctions de la bibliothèque Runtime sont marqués comme des blocs CRT pour pouvoir être traités séparément. En conséquence, ils n'influent pas forcément sur la détection des fuites et les autres opérations. Une allocation ne doit jamais allouer, réallouer ou libérer un bloc de type CRT._CLIENT_BLOCK
Pour les besoins du débogage, une application peut effectuer un suivi spécial d'un groupe donné d'allocations en leur associant ce type de bloc de mémoire, avec des appels explicites aux fonctions du tas de débogage. Les MFC, par exemple, allouent tous les CObjects en tant que blocs Client ; les autres applications peuvent conserver différents objets mémoire dans des blocs Client. Il est également possible de spécifier des sous-types de bloc Client afin d'augmenter la granularité du suivi. Pour spécifier des sous-types de bloc Client, décalez le nombre de gauche de 16 bits et faites une réunion logique (OR) avec _CLIENT_BLOCK. Par exemple :#define MYSUBTYPE 4 freedbg(pbData, _CLIENT_BLOCK|(MYSUBTYPE<<16));
Vous pouvez installer une fonction de raccordement fournie par le client pour faire un dump des objets stockés dans les blocs Client avec _CrtSetDumpClient. Cette fonction sera ensuite appelée chaque fois qu'un bloc Client fera l'objet d'un dump à l'aide d'une fonction de débogage. Par ailleurs, _CrtDoForAllClientObjects peut servir à appeler une fonction donnée fournie par l'application pour chaque bloc Client dans le tas de débogage.
_FREE_BLOCK
Normalement, les blocs qui sont libérés sont supprimés de la liste. Pour vérifier qu'aucune écriture n'est plus effectuée dans la mémoire libérée ou pour simuler des conditions de mémoire insuffisante, vous pouvez choisir de conserver les blocs libérés sur la liste liée, marqués en tant que Free et remplis avec une valeur d'octet connue (actuellement 0xDD)._IGNORE_BLOCK
Il est possible de désactiver les opérations du tas de débogage pendant une certaine durée. Pendant cette période, les blocs de mémoire sont conservés dans la liste, mais marqués en tant que blocs Ignore.
Pour déterminer le type et le sous-type d'un bloc donné, utilisez la fonction _CrtReportBlockType et les macros _BLOCK_TYPE et _BLOCK_SUBTYPE. Les macros sont définies (dans crtdbg.h) comme suit :
#define _BLOCK_TYPE(block) (block & 0xFFFF)
#define _BLOCK_SUBTYPE(block) (block >> 16 & 0xFFFF)