_CrtIsValidHeapPointer
Sprawdza, czy określony wskaźnik znajduje się w stercie przydzielonej przez bibliotekę czasu wykonywania języka C, ale niekoniecznie przez bibliotekę CRT obiektu wywołującego. W wersjach CRT przed programem Visual Studio 2010 ta funkcja sprawdza, czy określony wskaźnik znajduje się w lokalnym stercie (tylko wersja debugowania).
Składnia
int _CrtIsValidHeapPointer(
const void *userData
);
Parametry
userData
Wskaźnik na początek przydzielonego bloku pamięci.
Wartość zwracana
_CrtIsValidHeapPointer
zwraca TRUE
wartość , jeśli określony wskaźnik znajduje się w stercie współużytkowanej przez wszystkie wystąpienia bibliotekI CRT. W wersjach CRT przed visual Studio 2010 ta funkcja zwraca TRUE
, jeśli określony wskaźnik znajduje się w lokalnym stercie. W przeciwnym razie funkcja zwraca FALSE
wartość .
Uwagi
Nie zalecamy używania tej funkcji. Począwszy od biblioteki CRT programu Visual Studio 2010, wszystkie biblioteki CRT współdzielą jedną stertę systemu operacyjnego, stertę procesu. Funkcja _CrtIsValidHeapPointer
zgłasza, czy wskaźnik został przydzielony w stercie CRT, ale nie, że został przydzielony przez bibliotekę CRT obiektu wywołującego. Rozważmy na przykład blok przydzielony przy użyciu programu Visual Studio 2010 w wersji biblioteki CRT. _CrtIsValidHeapPointer
Jeśli funkcja wyeksportowana przez wersję biblioteki CRT programu Visual Studio 2012 testuje wskaźnik, zwraca wartość TRUE
. Ten test nie jest już przydatny. W wersjach biblioteki CRT przed programem Visual Studio 2010 funkcja jest używana do zapewnienia, że określony adres pamięci znajduje się w lokalnym stercie. Sterta lokalna odnosi się do sterta utworzonego i zarządzanego przez określone wystąpienie biblioteki czasu wykonywania języka C. Jeśli biblioteka dll (dynamic-link library) zawiera statyczny link do biblioteki czasu wykonywania, ma własne wystąpienie stert w czasie wykonywania, a tym samym własny stertę, niezależnie od lokalnego sterta aplikacji. Gdy _DEBUG
nie jest zdefiniowana, wywołania do _CrtIsValidHeapPointer
są usuwane podczas przetwarzania wstępnego.
Ponieważ ta funkcja zwraca TRUE
wartość lub FALSE
, można ją przekazać do jednego z _ASSERT
makr w celu utworzenia podstawowego mechanizmu obsługi błędów debugowania. Poniższy przykład powoduje niepowodzenie asercji, jeśli określony adres nie znajduje się w stercie lokalnym:
_ASSERTE( _CrtIsValidHeapPointer( userData ) );
Aby uzyskać więcej informacji na temat _CrtIsValidHeapPointer
sposobu użycia z innymi funkcjami debugowania i makrami, zobacz Makra do raportowania. Aby uzyskać informacje na temat przydzielania, inicjowania i zarządzania blokami pamięci w wersji debugowania sterty podstawowej, zobacz szczegóły sterty debugowania CRT.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_CrtIsValidHeapPointer |
<crtdbg.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Biblioteki
Debugowanie tylko wersji bibliotek czasu wykonywania języka C.
Przykład
W poniższym przykładzie pokazano, jak sprawdzić, czy pamięć jest prawidłowa, gdy jest używana z bibliotekami czasu wykonywania języka C przed programem Visual Studio 2010. Ten przykład jest udostępniany dla użytkowników starszego kodu biblioteki CRT.
// crt_isvalid.c
// This program allocates a block of memory using _malloc_dbg
// and then tests the validity of this memory by calling
// _CrtIsMemoryBlock,_CrtIsValidPointer, and _CrtIsValidHeapPointer.
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
#define TRUE 1
#define FALSE 0
int main( void )
{
char *my_pointer;
// Call _malloc_dbg to include the filename and line number
// of our allocation request in the header information
my_pointer = (char *)_malloc_dbg( sizeof(char) * 10,
_NORMAL_BLOCK, __FILE__, __LINE__ );
// Ensure that the memory got allocated correctly
_CrtIsMemoryBlock((const void *)my_pointer, sizeof(char) * 10,
NULL, NULL, NULL );
// Test for read/write accessibility
if (_CrtIsValidPointer((const void *)my_pointer,
sizeof(char) * 10, TRUE))
printf("my_pointer has read and write accessibility.\n");
else
printf("my_pointer only has read access.\n");
// Make sure my_pointer is within the local heap
if (_CrtIsValidHeapPointer((const void *)my_pointer))
printf("my_pointer is within the local heap.\n");
else
printf("my_pointer is not located within the local"
" heap.\n");
free(my_pointer);
}
my_pointer has read and write accessibility.
my_pointer is within the local heap.