_expand_dbg
Ridimensiona un blocco di memoria specificato nell'heap espandendo o contraendo il blocco (solo versione di debug).
Sintassi
void *_expand_dbg(
void *userData,
size_t newSize,
int blockType,
const char *filename,
int lineNumber
);
Parametri
userData
Puntatore al blocco di memoria allocato precedentemente.
newSize
Nuove dimensioni richieste per il blocco, in byte.
blockType
Tipo di blocco ridimensionato richiesto: _CLIENT_BLOCK
o _NORMAL_BLOCK
.
filename
Puntatore al nome del file di origine che ha richiesto l'operazione di espansione oppure NULL
.
lineNumber
Numero di riga nel file di origine in cui è stata richiesta l'operazione di espansione oppure NULL
.
I filename
parametri e lineNumber
sono disponibili solo quando _expand_dbg
è stato chiamato in modo esplicito o la costante del _CRTDBG_MAP_ALLOC
preprocessore è stata definita.
Valore restituito
Al termine, _expand_dbg
restituisce un puntatore al blocco di memoria ridimensionato. Poiché la memoria non viene spostata, l'indirizzo corrisponde a userData. Se si è verificato un errore o non è stato possibile espandere il blocco fino alle dimensioni richieste, restituisce NULL
. Se si verifica un errore, viene restituito errno
con le informazioni dal sistema operativo sulla natura dell'errore. Per altre informazioni su errno
, vedere errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Osservazioni:
La _expand_dbg
funzione è una versione di debug della funzione _expand
. Quando _DEBUG
non è definito, ogni chiamata a _expand_dbg
viene ridotta a una chiamata a _expand
. Sia _expand
che _expand_dbg
ridimensionano un blocco di memoria nell'heap di base, ma _expand_dbg
contiene diverse funzionalità di debug: buffer presenti a entrambi i lati della parte del blocco da verificare per le perdite, un parametro di tipo del blocco per registrare i tipi specifici di allocazioni e informazioni su filename
/lineNumber
per determinare l'origine delle richieste di allocazione.
_expand_dbg
ridimensiona il blocco di memoria specificato con una quantità di spazio appena superiore al valore richiesto di newSize
. newSize
potrebbe essere maggiore o minore della dimensione del blocco di memoria allocato in origine. Lo spazio aggiuntivo viene usato dal gestore dell'heap di debug per collegare i blocchi di memoria di debug e per fornire all'applicazione informazioni sull'intestazione di debug e buffer di sovrascrittura. Il ridimensionamento viene eseguito espandendo o contraendo il blocco di memoria originale. _expand_dbg
non sposta il blocco di memoria, come fa la _realloc_dbg
funzione .
Quando newSize
è maggiore del blocco originale, il blocco di memoria viene espanso. Durante un'espansione, se il blocco di memoria non può essere espanso per supportare le dimensioni richieste, NULL
viene restituito . Quando newSize
è inferiore alle dimensioni del blocco originale, il blocco di memoria viene contratto fino a ottenere le nuove dimensioni richieste.
Per informazioni sulla modalità di allocazione, inizializzazione e gestione dei blocchi di memoria nella versione di debug dell'heap di base, vedere Dettagli dell'heap di debug CRT. Per informazioni sui tipi di blocchi di allocazione e sul modo in cui vengono usati, vedere Tipi di blocchi nell'heap di debug. Per informazioni sulle differenze tra le funzioni heap standard e le versioni di debug, vedere Eseguire il debug delle versioni delle funzioni di allocazione dell'heap.
Questa funzione convalida i relativi parametri. Se userData
è un puntatore Null o se size è maggiore di _HEAP_MAXREQ
, questa funzione richiama un gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, errno
viene impostato su EINVAL
e la funzione restituisce NULL
.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_expand_dbg |
<crtdbg.h> |
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Librerie
Solo le versioni di debug delle librerie di runtime di C.
Esempio
// 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
Commento
L'output di questo programma dipende dalla capacità del computer di espandere tutte le sezioni. Se tutte le sezioni sono espanse, l'output è nella sezione Output.