_expand_dbg

Redimensionne un bloc de mémoire spécifié dans le tas en étendant ou en réduisant le bloc (version de débogage uniquement).

Syntaxe

void *_expand_dbg(
   void *userData,
   size_t newSize,
   int blockType,
   const char *filename,
   int lineNumber
);

Paramètres

userData
Pointeur vers le bloc de mémoire précédemment alloué.

newSize
Nouvelle taille demandée pour le bloc (en octets).

blockType
Type demandé pour le bloc redimensionné : _CLIENT_BLOCK ou _NORMAL_BLOCK.

filename
Pointeur désignant le nom du fichier source qui a demandé l’opération d’extension ou NULL.

lineNumber
Numéro de ligne dans le fichier source où l’opération d’extension a été demandée ou NULL.

Les filename paramètres et lineNumber les paramètres sont disponibles uniquement lorsqu’ils ont été appelés explicitement ou si _expand_dbg la _CRTDBG_MAP_ALLOC constante de préprocesseur a été définie.

Valeur retournée

Si l’opération réussit, _expand_dbg retourne un pointeur désignant le bloc de mémoire redimensionné. Étant donné que la mémoire n’est pas déplacée, l’adresse est identique à userData. Si une erreur s’est produite ou si le bloc n’a pas pu être développé à la taille demandée, il retourne NULL. En cas d’échec, errno comporte des informations issues du système d’exploitation sur la nature de l’échec. Pour plus d’informations sur errno, voir errno, _doserrno, , _sys_errlistet _sys_nerr.

Notes

La _expand_dbg fonction est une version de débogage de la fonction _expand . Lorsqu’il _DEBUG n’est pas défini, chaque appel à est _expand_dbg réduit à un appel à _expand. _expand et _expand_dbg redimensionnent toutes deux un bloc de mémoire dans le tas de base, mais _expand_dbg gère plusieurs fonctionnalités de débogage : des mémoires tampons de chaque côté de la partie utilisateur du bloc pour vérifier la présence de fuites, un paramètre de type de bloc pour effectuer le suivi de types d’allocation spécifiques et des informations filename/lineNumber pour déterminer l’origine des demandes d’allocation.

_expand_dbg redimensionne le bloc de mémoire spécifié avec un peu plus d’espace que la valeur newSize demandée. newSize peut être inférieure ou supérieure à la taille du bloc de mémoire alloué initialement. L’espace supplémentaire est utilisé par le gestionnaire de tas de débogage pour lier les blocs de mémoire de débogage et fournir à l’application des informations d’en-tête de débogage et remplacer les mémoires tampons. Le redimensionnement s’effectue en étendant ou en réduisant le bloc de mémoire d’origine. _expand_dbg ne déplace pas le bloc de mémoire, comme la _realloc_dbg fonction.

Quand newSize est supérieur à la taille du bloc d’origine, le bloc de mémoire est étendu. Pendant une extension, si le bloc de mémoire ne peut pas être développé pour prendre en charge la taille demandée, NULL est retourné. Quand newSize est inférieur à la taille du bloc d’origine, le bloc de mémoire est réduit jusqu’à ce que la nouvelle taille soit obtenue.

Pour plus d’informations sur la façon dont les blocs de mémoire sont alloués, initialisés et gérés dans la version de débogage du tas de base, consultez les détails du tas de débogage CRT. Pour plus d’informations sur les types de blocs d’allocation et leur utilisation, consultez Types de blocs sur le tas de débogage. Pour plus d’informations sur les différences entre les fonctions de tas standard et les versions de débogage, consultez Les versions de débogage des fonctions d’allocation de tas.

Cette fonction valide ses paramètres. S’il userData s’agit d’un pointeur Null ou si la taille est supérieure _HEAP_MAXREQà , cette fonction appelle un gestionnaire de paramètres non valide, comme décrit dans la validation des paramètres. Si l’exécution est autorisée à se poursuivre, errno a la valeur EINVAL et la fonction retourne NULL.

Spécifications

Routine En-tête requis
_expand_dbg <crtdbg.h>

Pour plus d’informations sur la compatibilité, consultez Compatibility.

Bibliothèques

Uniquement les versions de débogage des bibliothèques Runtime C.

Exemple

// crt_expand_dbg.c
//
// This program allocates a block of memory using _malloc_dbg
// and then calls _msize_dbg to display the size of that block.
// Next, it uses _expand_dbg to expand the amount of
// memory used by the buffer and then calls _msize_dbg again to
// display the new amount of memory allocated to the buffer.
//

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <crtdbg.h>

int main( void )
{
   long *buffer;
   size_t size;

   // Call _malloc_dbg to include the filename and line number
   // of our allocation request in the header
   buffer = (long *)_malloc_dbg( 40 * sizeof(long),
                                 _NORMAL_BLOCK, __FILE__, __LINE__ );
   if( buffer == NULL )
      exit( 1 );

   // Get the size of the buffer by calling _msize_dbg
   size = _msize_dbg( buffer, _NORMAL_BLOCK );
   printf( "Size of block after _malloc_dbg of 40 longs: %u\n", size );

   // Expand the buffer using _expand_dbg and show the new size
   buffer = (long *)_expand_dbg( buffer, size + sizeof(long),
                                 _NORMAL_BLOCK, __FILE__, __LINE__ );

   if( buffer == NULL )
      exit( 1 );
   size = _msize_dbg( buffer, _NORMAL_BLOCK );
   printf( "Size of block after _expand_dbg of 1 more long: %u\n",
           size );

   free( buffer );
   exit( 0 );
}
Size of block after _malloc_dbg of 40 longs: 160
Size of block after _expand_dbg of 1 more long: 164

Commentaire

La sortie de ce programme dépend de la capacité de votre ordinateur à étendre toutes les sections. Si toutes les sections sont étendues, la sortie est reflétée dans la section de sortie.

Voir aussi

Routines de débogage
_malloc_dbg