_CrtIsValidHeapPointer
Verifica se um ponteiro especificado está em um heap alocado por alguma biblioteca em tempo de execução C, mas não necessariamente pela biblioteca CRT do chamador. Em versões do CRT anteriores ao Visual Studio 2010, essa função verifica se o ponteiro especificado está no heap local (somente versão de depuração).
Sintaxe
int _CrtIsValidHeapPointer(
const void *userData
);
Parâmetros
userData
Ponteiro para o início de um bloco de memória alocado.
Valor retornado
_CrtIsValidHeapPointer
retornará TRUE
se o ponteiro especificado estiver no heap compartilhado por todas as instâncias da biblioteca do CRT. Em versões do CRT anteriores ao Visual Studio 2010, essa função retornará TRUE
se o ponteiro especificado estiver no heap local. Caso contrário, a função retorna FALSE
.
Comentários
Não recomendamos que você use essa função. A partir da biblioteca CRT no Visual Studio 2010, todas as bibliotecas CRT compartilham um heap do sistema operacional, o heap de processo. A função _CrtIsValidHeapPointer
relata se o ponteiro foi alocado em um heap CRT, mas não que ele foi alocado pela biblioteca CRT do chamador. Por exemplo, considere um bloco alocado usando a versão do Visual Studio 2010 da biblioteca CRT. Se a função _CrtIsValidHeapPointer
exportada pela versão do Visual Studio 2012 da biblioteca do CRT testar o ponteiro, ela retornará TRUE
. Este teste não é mais útil. Nas versões da biblioteca CRT anteriores ao Visual Studio 2010, a função é usada para garantir que um endereço de memória específico está no heap local. O heap local refere-se ao heap criado e gerenciado por uma instância específica da biblioteca em tempo de execução C. Se uma DLL (biblioteca de vínculo dinâmico) contiver um link estático para a biblioteca em tempo de execução, ela terá sua própria instância do heap em tempo de execução e, portanto, seu próprio heap, independente do heap local do aplicativo. Quando _DEBUG
não está definido, as chamadas para _CrtIsValidHeapPointer
são removidas durante o pré-processamento.
Como essa função retorna TRUE
ou FALSE
, ela pode ser passada para uma das macros para criar um mecanismo básico de tratamento de _ASSERT
erros de depuração. O seguinte exemplo causa uma falha de declaração se o endereço especificado não estiver localizado no heap local:
_ASSERTE( _CrtIsValidHeapPointer( userData ) );
Para obter mais informações sobre como _CrtIsValidHeapPointer
pode ser usado com outras funções de depuração e macros, consulte Macros para relatórios. Para obter informações sobre como os blocos de memória são alocados, inicializados e gerenciados na versão de depuração do heap base, consulte Detalhes do heap de depuração do CRT.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
_CrtIsValidHeapPointer |
<crtdbg.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Bibliotecas
Somente versões de depuração de bibliotecas de tempo de execução C.
Exemplo
O exemplo a seguir demonstra como testar se a memória é válida quando usada com bibliotecas de runtime do C anteriores ao Visual Studio 2010. Esse exemplo é fornecido para usuários do código herdado da biblioteca 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.