_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í FALSE
hodnotu .
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.