_CrtIsValidHeapPointer
Überprüft, ob sich ein angegebener Zeiger in einem Heap befindet, der durch eine C-Laufzeitbibliothek zugewiesen wurde, aber nicht notwendigerweise durch die CRT-Bibliothek des Aufrufers. In Versionen des CRT vor Visual Studio 2010 überprüft diese Funktion, ob sich der angegebene Zeiger im lokalen Heap befindet (nur Debugversion).
Syntax
int _CrtIsValidHeapPointer(
const void *userData
);
Parameter
userData
Zeiger auf den Anfang eines belegten Speicherblocks.
Rückgabewert
_CrtIsValidHeapPointer
gibt zurück TRUE
, wenn sich der angegebene Zeiger im Heap befindet, der von allen CRT-Bibliotheksinstanzen freigegeben wird. In Versionen des CRT vor Visual Studio 2010 gibt diese Funktion zurück TRUE
, wenn sich der angegebene Zeiger im lokalen Heap befindet. Andernfalls wird von der Funktion FALSE
zurückgegeben.
Hinweise
Es wird nicht empfohlen, diese Funktion zu verwenden. Ab der Visual Studio 2010-CRT-Bibliothek nutzen alle CRT-Bibliotheken gemeinsam einen OS-Heap, den Prozessheap. Die _CrtIsValidHeapPointer
-Funktion meldet, ob der Zeiger in einem CRT-Heap zugewiesen wurde, aber nicht, dass er durch die CRT-Bibliothek des Aufrufers zugewiesen wurde. Betrachten Sie beispielsweise einen Block, der mit der Visual Studio 2010-Version der CRT-Bibliothek zugeordnet wurde. Wenn die _CrtIsValidHeapPointer
von der Visual Studio 2012-Version der CRT-Bibliothek exportierte Funktion den Zeiger testet, wird der Zeiger zurückgegeben TRUE
. Dieser Test ist nicht mehr nützlich. In Versionen der CRT-Bibliothek vor Visual Studio 2010 wird die Funktion verwendet, um sicherzustellen, dass sich eine bestimmte Speicheradresse im lokalen Heap befindet. Der lokale Heap verweist auf den Heap, der von einer bestimmten Instanz der C-Laufzeitbibliothek erstellt und verwaltet wird. Wenn eine Dynamic Link Library (DLL) einen statischen Link zur Laufzeitbibliothek enthält, hat sie ihre eigene Instanz des Laufzeitheaps und daher ihren eigenen Heap, unabhängig vom lokalen Heap der Anwendung. Wenn _DEBUG
nicht definiert ist, werden Aufrufe von _CrtIsValidHeapPointer
während der Vorverarbeitung entfernt.
Da diese Funktion zurückgibt TRUE
oder FALSE
, kann sie an eines der _ASSERT
Makros übergeben werden, um einen grundlegenden Fehlerbehandlungsmechanismus für das Debuggen zu erstellen. Im folgenden Beispiel wird ein Assertionsfehler verursacht, wenn sich die angegebene Adresse nicht innerhalb des lokalen Heaps befindet:
_ASSERTE( _CrtIsValidHeapPointer( userData ) );
Weitere Informationen zur _CrtIsValidHeapPointer
Verwendung mit anderen Debugfunktionen und Makros finden Sie unter "Makros für die Berichterstellung". Informationen dazu, wie Speicherblöcke in der Debugversion des Basis heap zugeordnet, initialisiert und verwaltet werden, finden Sie unter CRT Debug Heap Details.
Anforderungen
Routine | Erforderlicher Header |
---|---|
_CrtIsValidHeapPointer |
<crtdbg.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Libraries
Nur Debugversionen von C-Laufzeitbibliotheken
Beispiel
Im folgenden Beispiel wird veranschaulicht, wie Sie testen, ob Arbeitsspeicher gültig ist, wenn sie mit C-Laufzeitbibliotheken vor Visual Studio 2010 verwendet wird. Dieses Beispiel wird für Benutzer von Legacycode der CRT-Bibliothek bereitgestellt.
// 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.