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