_expand_dbg
Zmienia rozmiar określonego bloku pamięci w stercie przez rozwinięcie lub zakontraktowanie bloku (tylko wersja debugowania).
Składnia
void *_expand_dbg(
void *userData,
size_t newSize,
int blockType,
const char *filename,
int lineNumber
);
Parametry
userData
Wskaźnik do wcześniej przydzielonego bloku pamięci.
newSize
Zażądano nowego rozmiaru bloku (w bajtach).
blockType
Żądany typ zmiany rozmiaru bloku: _CLIENT_BLOCK
lub _NORMAL_BLOCK
.
filename
Wskaźnik do nazwy pliku źródłowego, który zażądał operacji rozszerzenia lub NULL
.
lineNumber
Numer wiersza w pliku źródłowym, w którym zażądano operacji rozwijania lub NULL
.
Parametry filename
i lineNumber
są dostępne tylko wtedy, gdy _expand_dbg
została wywołana jawnie lub zdefiniowano stałą _CRTDBG_MAP_ALLOC
preprocesora.
Wartość zwracana
Po pomyślnym zakończeniu _expand_dbg
zwraca wskaźnik do bloku pamięci o zmienionym rozmiarze. Ponieważ pamięć nie jest przenoszona, adres jest taki sam jak userData. Jeśli wystąpił błąd lub nie można rozwinąć bloku do żądanego rozmiaru, zwraca wartość NULL
. Jeśli wystąpi awaria, errno
zawiera informacje z systemu operacyjnego o charakterze awarii. Aby uzyskać więcej informacji na temat errno
programu , zobaczerrno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Funkcja _expand_dbg
jest wersją debugowania funkcji _expand
. Jeśli _DEBUG
nie jest zdefiniowane, każde wywołanie metody _expand_dbg
jest zmniejszane do wywołania metody _expand
. Zarówno _expand
blok pamięci w stercie podstawowej, jak i _expand_dbg
zmiana rozmiaru, ale _expand_dbg
obsługuje kilka funkcji debugowania: po obu stronach bloku w celu przetestowania przecieków, parametr typu bloku w celu śledzenia określonych typów alokacji i filename
/lineNumber
informacji w celu określenia źródła żądań alokacji.
_expand_dbg
zmienia rozmiar określonego bloku pamięci z nieco większą ilością miejsca niż żądany newSize
element . newSize
może być większy lub mniejszy niż rozmiar pierwotnie przydzielonego bloku pamięci. Dodatkowe miejsce jest używane przez menedżera sterty debugowania, aby połączyć bloki pamięci debugowania i udostępnić aplikacji informacje nagłówka debugowania i zastąpić. Zmiana rozmiaru jest realizowana przez rozszerzenie lub zakontraktowanie oryginalnego bloku pamięci. _expand_dbg
nie przenosi bloku pamięci, podobnie jak _realloc_dbg
funkcja.
Gdy newSize
jest większy niż rozmiar oryginalnego bloku, blok pamięci jest rozszerzany. Jeśli blok pamięci nie może zostać rozszerzony w celu uwzględnienia żądanego rozmiaru, NULL
zostanie zwrócony podczas rozszerzania. Gdy newSize
jest mniejszy niż rozmiar oryginalnego bloku, blok pamięci jest kontraktowany do momentu uzyskania nowego rozmiaru.
Aby uzyskać informacje na temat przydzielania, inicjowania i zarządzania blokami pamięci w wersji debugowania sterty podstawowej, zobacz szczegóły sterty debugowania CRT. Aby uzyskać informacje o typach bloków alokacji i sposobie ich użycia, zobacz Typy bloków na stercie debugowania. Aby uzyskać informacje o różnicach między standardowymi funkcjami sterty i wersjami debugowania, zobacz Debugowanie wersji funkcji alokacji sterty.
Ta funkcja weryfikuje jego parametry. Jeśli userData
jest wskaźnikiem o wartości null lub jeśli rozmiar jest większy niż _HEAP_MAXREQ
, ta funkcja wywołuje nieprawidłową procedurę obsługi parametrów zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, jest ustawione na EINVAL
, errno
a funkcja zwraca wartość NULL
.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_expand_dbg |
<crtdbg.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Biblioteki
Debugowanie tylko wersji bibliotek czasu wykonywania języka C.
Przykład
// 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
Komentarz
Dane wyjściowe tego programu zależą od możliwości rozszerzenia wszystkich sekcji na komputerze. Jeśli wszystkie sekcje zostaną rozwinięte, dane wyjściowe zostaną odzwierciedlone w sekcji Dane wyjściowe.