Udostępnij za pośrednictwem


_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 FALSEwartość .

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.

Zobacz też

Procedury debugowania