Condividi tramite


_CrtIsValidHeapPointer

Verifica che un puntatore specificato sia nell'heap allocato da alcune librerie di runtime del linguaggio C , ma non necessariamente dalla libreria CRT del chiamante. Nelle versioni di CRT precedenti a Visual Studio 2010, questa funzione verifica che il puntatore specificato si trova nell'heap locale (solo versione di debug).

Sintassi

int _CrtIsValidHeapPointer(
   const void *userData
);

Parametri

userData
Puntatore all'inizio di un blocco di memoria allocata.

Valore restituito

_CrtIsValidHeapPointer restituisce TRUE se il puntatore specificato si trova nell'heap condiviso da tutte le istanze della libreria CRT. Nelle versioni di CRT precedenti a Visual Studio 2010, questa funzione restituisce TRUE se il puntatore specificato si trova nell'heap locale. In caso contrario, la funzione restituisce FALSE.

Osservazioni:

Non è consigliabile usare questa funzione. A partire dalla libreria CRT di Visual Studio 2010, tutte le librerie CRT condividono un heap del sistema operativo, ovvero l'heap del processo. La funzione _CrtIsValidHeapPointer indica se un puntatore sia allocato in un heap CRT, ma non che il puntatore era allocato dalla libreria CRT del chiamante. Ad esempio, si prenda in considerazione un blocco allocato usando la versione di Visual Studio 2010 della libreria CRT. Se la _CrtIsValidHeapPointer funzione esportata dalla versione di Visual Studio 2012 della libreria CRT verifica il puntatore, restituisce TRUE. Questo test non è più utile. Nelle versioni della libreria CRT precedenti a Visual Studio 2010, la funzione viene usata per assicurare che un indirizzo di memoria specifico sia presente nell'heap locale. L'heap locale fa riferimento all'heap creato e gestito tramite una determinata istanza della libreria di runtime del linguaggio C. Se una libreria a collegamento dinamico (DLL) contiene un collegamento statico alla libreria di runtime, dispone della propria istanza dell'heap di runtime e di conseguenza il proprio heap, indipendentemente dall'heap locale dell'applicazione. Quando _DEBUG non è definito, le chiamate a _CrtIsValidHeapPointer vengono rimosse durante la pre-elaborazione.

Poiché questa funzione restituisce TRUE o FALSE, può essere passata a una delle _ASSERT macro per creare un meccanismo di base di gestione degli errori di debug. Nell'esempio seguente viene generato un errore di asserzione se l'indirizzo specificato non si trova all'interno dell'heap locale:

_ASSERTE( _CrtIsValidHeapPointer( userData ) );

Per altre informazioni su come _CrtIsValidHeapPointer usare con altre funzioni di debug e macro, vedere Macro per la creazione di report. Per informazioni sulla modalità di allocazione, inizializzazione e gestione dei blocchi di memoria nella versione di debug dell'heap di base, vedere Dettagli dell'heap di debug CRT.

Requisiti

Ciclo Intestazione obbligatoria
_CrtIsValidHeapPointer <crtdbg.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Librerie

Solo le versioni di debug delle librerie di runtime di C.

Esempio

L'esempio seguente illustra come verificare se la memoria è valida quando viene usata con le librerie di runtime C prima di Visual Studio 2010. Questo esempio viene fornito per gli utenti di codice della libreria CRT legacy.

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

Vedi anche

Routine di debug