Partager via


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

Voir aussi

Routines de débogage