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