Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ändrar storlek på ett angivet minnesblock i heapen genom att expandera eller kontraktera blocket (endast felsökningsversion).
Syntax
void *_expand_dbg(
void *userData,
size_t newSize,
int blockType,
const char *filename,
int lineNumber
);
Parameterar
userData
Pekare till det tidigare allokerade minnesblocket.
newSize
Begärd ny storlek för blocket (i byte).
blockType
Begärd typ för storleksblock: _CLIENT_BLOCK eller _NORMAL_BLOCK.
filename
Pekare till namnet på källfilen som begärde expanderingsåtgärden eller NULL.
lineNumber
Radnummer i källfilen där expanderingsåtgärden begärdes eller NULL.
Parametrarna filename och lineNumber är endast tillgängliga när _expand_dbg har anropats explicit eller om konstanten _CRTDBG_MAP_ALLOC för processor har definierats.
Returvärde
Vid slutförande _expand_dbg returnerar en pekare till det storleksanpassade minnesblocket. Eftersom minnet inte flyttas är adressen samma som userData. Om ett fel uppstod eller om blocket inte kunde expanderas till den begärda storleken returnerar NULLdet . Om ett fel inträffar, errno är med information från operativsystemet om typen av fel. Mer information om errnofinns i errno, _doserrno, _sys_errlistoch _sys_nerr.
Anmärkningar
Funktionen _expand_dbg är en felsökningsversion av _expand funktionen. När _DEBUG inte har definierats reduceras varje anrop till _expand_dbg till ett anrop till _expand. Både _expand och _expand_dbg ändra storlek på ett minnesblock i bashögen, men _expand_dbg rymmer flera felsökningsfunktioner: buffertar på vardera sidan av användardelen av blocket för att testa för läckor, en blocktypsparameter för att spåra specifika allokeringstyper och filename/lineNumber information för att fastställa ursprunget för allokeringsbegäranden.
_expand_dbg ändrar storlek på det angivna minnesblocket med något mer utrymme än det begärda newSize.
newSize kan vara större eller mindre än storleken på det ursprungligen allokerade minnesblocket. Det extra utrymmet används av felsökningshanteraren för heap för att länka minnesblocken för felsökning och för att ge programmet information om felsökningshuvud och skriva över buffertar. Storleksändringen utförs genom att antingen expandera eller kontraktera det ursprungliga minnesblocket.
_expand_dbg flyttar inte minnesblocket, liksom _realloc_dbg funktionen.
När newSize är större än den ursprungliga blockstorleken expanderas minnesblocket. Om minnesblocket inte kan utökas för den begärda storleken NULL under en expansion returneras. När newSize är mindre än den ursprungliga blockstorleken kontrakteras minnesblocket tills den nya storleken hämtas.
Information om hur minnesblock allokeras, initieras och hanteras i felsökningsversionen av bashögen finns i information om CRT-felsöknings heap. Information om typer av allokeringsblock och hur de används finns i Typer av block på felsöknings-heapen. Information om skillnaderna mellan standard-heap-funktioner och felsökningsversioner finns i Felsöka versioner av heap-allokeringsfunktioner.
Den här funktionen validerar dess parametrar. Om userData är en null-pekare, eller om storleken är större än _HEAP_MAXREQ, anropar den här funktionen en ogiltig parameterhanterare enligt beskrivningen i Parameterverifiering. Om körningen tillåts fortsätta errno anges till EINVAL och funktionen returnerar NULL.
Kravspecifikation
| Rutin | Obligatoriskt huvud |
|---|---|
_expand_dbg |
<crtdbg.h> |
Mer kompatibilitetsinformation finns i Kompatibilitet.
Libraries
Felsöka endast versioner av C-körningsbibliotek .
Example
// 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
Comment
Utdata från det här programmet beror på datorns förmåga att expandera alla avsnitt. Om alla avsnitt expanderas återspeglas utdata i avsnittet Utdata.