_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.

Siehe auch

Debugroutinen