_CrtIsValidHeapPointer
Vérifie que le pointeur spécifié se trouve dans un tas alloué par une bibliothèque Runtime C, mais pas nécessairement par la bibliothèque CRT de l'appelant. Dans les versions du CRT avant Visual Studio 2010, cette fonction vérifie que le pointeur spécifié se trouve dans le tas local (version de débogage uniquement).
Syntaxe
int _CrtIsValidHeapPointer(
const void *userData
);
Paramètres
userData
Pointeur indiquant le début d'un bloc de mémoire alloué.
Valeur retournée
_CrtIsValidHeapPointer
retourne TRUE
si le pointeur spécifié se trouve dans le tas partagé par toutes les instances de bibliothèque CRT. Dans les versions du CRT avant Visual Studio 2010, cette fonction retourne TRUE
si le pointeur spécifié se trouve dans le tas local. Sinon, la fonction retourne FALSE
.
Notes
Nous vous déconseillons d’utiliser cette fonction. À compter de la bibliothèque CRT de Visual Studio 2010, toutes les bibliothèques CRT partagent un même tas du système d’exploitation : le tas de processus. La fonction _CrtIsValidHeapPointer
indique si le pointeur a été alloué dans un tas CRT, mais pas s'il a été alloué par la bibliothèque CRT de l'appelant. Par exemple, supposons qu'un bloc a été alloué à l'aide de la version Visual Studio 2010 de la bibliothèque CRT. Si la _CrtIsValidHeapPointer
fonction exportée par la version visual Studio 2012 de la bibliothèque CRT teste le pointeur, elle retourne TRUE
. Ce test n’est plus utile. Dans les versions de la bibliothèque CRT antérieures à Visual Studio 2010, la fonction permet de s'assurer qu'une adresse mémoire spécifique se trouve dans le tas local. Le tas local fait référence au tas créé et géré par une instance particulière de la bibliothèque Runtime C. Si une bibliothèque de liens dynamiques (DLL) contient un lien statique vers la bibliothèque Runtime, elle possède sa propre instance du tas Runtime et donc son propre tas, indépendant du tas local de l'application. Quand _DEBUG
n’est pas défini, les appels à _CrtIsValidHeapPointer
sont supprimés lors du prétraitement.
Étant donné que cette fonction retourne TRUE
ou FALSE
, elle peut être passée à l’une _ASSERT
des macros pour créer un mécanisme de gestion des erreurs de débogage de base. L’exemple suivant provoque un échec d’assertion si l’adresse spécifiée n’est pas située dans le tas local :
_ASSERTE( _CrtIsValidHeapPointer( userData ) );
Pour plus d’informations sur _CrtIsValidHeapPointer
l’utilisation d’autres fonctions et macros de débogage, consultez Macros pour la création de rapports. Pour plus d’informations sur la façon dont les blocs de mémoire sont alloués, initialisés et gérés dans la version de débogage du tas de base, consultez les détails du tas de débogage CRT.
Spécifications
Routine | En-tête requis |
---|---|
_CrtIsValidHeapPointer |
<crtdbg.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Bibliothèques
Uniquement les versions de débogage des bibliothèques Runtime C.
Exemple
L’exemple suivant montre comment tester si la mémoire est valide lorsqu’elle est utilisée avec des bibliothèques d’exécution C avant Visual Studio 2010. Cet exemple est fourni pour les utilisateurs de code de bibliothèque CRT hérité.
// 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.