Поделиться через


_CrtIsValidHeapPointer

Проверяет, находится ли заданный указатель в куче, выделенной определенной библиотекой среды выполнения C, но не обязательно библиотекой CRT вызывающей функции. В версиях CRT до Visual Studio 2010 эта функция проверяет, находится ли указанный указатель в локальной куче (только отладочная версия).

Синтаксис

int _CrtIsValidHeapPointer(
   const void *userData
);

Параметры

userData
Указатель на начало выделенного блока памяти.

Возвращаемое значение

_CrtIsValidHeapPointer возвращает, TRUE если указанный указатель находится в куче, к которой используются все экземпляры библиотекИ CRT. В версиях CRT до Visual Studio 2010 эта функция возвращается TRUE , если указанный указатель находится в локальной куче. В противном случае функция возвращает значение FALSE.

Замечания

Мы не рекомендуем использовать эту функцию. Начиная с библиотеки CRT в Visual Studio 2010, все библиотеки CRT используют одну и ту же кучу операционной системы — кучу процесса. Функция _CrtIsValidHeapPointer сообщает, выделен ли указатель в кучу CRT, но не указывает, был ли он выделен библиотекой CRT вызывающей функции. Возьмем для примера блок, выделенный с помощью библиотеки CRT в составе Visual Studio 2010. Если функция, экспортируемая _CrtIsValidHeapPointer visual Studio 2012 версии библиотеки CRT, проверяет указатель, он возвращается TRUE. Этот тест больше не полезен. В версиях библиотеки CRT до Visual Studio 2010 эта функция используется для проверки наличия того или иного адреса памяти в локальной куче. Локальная куча обращается к куче, созданной и управляемой определенным экземпляром библиотеки среды выполнения C. Если библиотека динамической компоновки (DLL) содержит статическую ссылку на библиотеку среды выполнения, она имеет свой собственный экземпляр кучи среды выполнения, а значит и собственную кучу, не зависящую от локальной кучи приложения. Если _DEBUG это не определено, вызовы _CrtIsValidHeapPointer удаляются во время предварительной обработки.

Так как эта функция возвращает TRUE или FALSEпередается одному из _ASSERT макросов, чтобы создать базовый механизм обработки ошибок отладки. В следующем примере происходит сбой утверждения, если указанный адрес не расположен в локальной куче:

_ASSERTE( _CrtIsValidHeapPointer( userData ) );

Дополнительные сведения о том, как _CrtIsValidHeapPointer можно использовать с другими функциями отладки и макросами, см. в разделе "Макросы" для создания отчетов. Сведения о выделении, инициализации и управлении блоками памяти в отладочной версии базовой кучи см. в сведениях об отладочной куче CRT.

Требования

Маршрут Обязательный заголовок
_CrtIsValidHeapPointer <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Библиотеки

Только отладочные версии библиотек времени выполнения языка C.

Пример

В следующем примере показано, как проверить, является ли память допустимой при использовании с библиотеками времени выполнения C до Visual Studio 2010. Пример приведен для пользователей предыдущих версий библиотеки кодов CRT.

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

См. также

Отладка подпрограмм