_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 errnoprogramu , zobaczerrno , _doserrno, _sys_errlisti _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: bufory 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 newSizeelement . 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ć bufory. 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.

Zobacz też

Procedury debugowania
_malloc_dbg