_CrtIsValidHeapPointer

Ověřuje, že zadaný ukazatel je v haldě přidělené některé knihovně runtime jazyka C, ale ne nutně knihovnou CRT volajícího. Ve verzích CRT před sadou Visual Studio 2010 tato funkce ověří, že zadaný ukazatel je v místní haldě (pouze ladicí verze).

Syntaxe

int _CrtIsValidHeapPointer(
   const void *userData
);

Parametry

userData
Ukazatel na začátek přiděleného bloku paměti.

Vrácená hodnota

_CrtIsValidHeapPointer vrátí TRUE , pokud je zadaný ukazatel v haldě sdílené všemi instancemi knihovny CRT. Ve verzích CRT před sadou Visual Studio 2010 tato funkce vrátí TRUE , pokud je zadaný ukazatel v místní haldě. V opačném případě funkce vrátí FALSEhodnotu .

Poznámky

Tuto funkci nedoporučujeme používat. Počínaje knihovnou CRT sady Visual Studio 2010 sdílejí všechny knihovny CRT jednu haldu operačního systému, haldu procesu. Funkce _CrtIsValidHeapPointer hlásí, zda byl ukazatel přidělen v haldě CRT, ale ne, že byl přidělen knihovnou CRT volajícího. Představte si například blok přidělený pomocí verze sady Visual Studio 2010 knihovny CRT. _CrtIsValidHeapPointer Pokud funkce exportovaná verzí knihovny CRT sady Visual Studio 2012 testuje ukazatel, vrátí .TRUE Tento test už není užitečný. Ve verzích knihovny CRT před sadou Visual Studio 2010 se tato funkce používá k zajištění, že konkrétní adresa paměti je v místní haldě. Místní halda odkazuje na haldu vytvořenou a spravovanou konkrétní instancí knihovny runtime jazyka C. Pokud dynamická knihovna (DLL) obsahuje statické propojení s knihovnou za běhu, má vlastní instanci haldy za běhu, a proto vlastní haldu nezávislou na místní haldě aplikace. Pokud _DEBUG není definováno, volání, která _CrtIsValidHeapPointer se mají odebrat během předběžného zpracování.

Vzhledem k tomu, že tato funkce vrací TRUE nebo FALSE, může být předána do jednoho z _ASSERT maker a vytvořit základní mechanismus zpracování chyb ladění. Následující příklad způsobí selhání kontrolního výrazu, pokud zadaná adresa není umístěna v místní haldě:

_ASSERTE( _CrtIsValidHeapPointer( userData ) );

Další informace o tom, jak _CrtIsValidHeapPointer se dají použít s dalšími ladicími funkcemi a makry, najdete v tématu Makra pro vytváření sestav. Informace o přidělování, inicializaci a správě bloků paměti ve verzi ladění základní haldy naleznete v podrobnostech haldy ladění CRT.

Požadavky

Rutina Požadovaný hlavičkový soubor
_CrtIsValidHeapPointer <crtdbg.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Knihovny

Ladění pouze verzí knihoven runtime jazyka C.

Příklad

Následující příklad ukazuje, jak otestovat, zda je paměť platná při použití s knihovnami za běhu jazyka C před sadou Visual Studio 2010. Tento příklad je k dispozici pro uživatele starší verze kódu knihovny 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.

Viz také

Rutiny ladění