Compartilhar via


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

Retornar valor

_CrtIsValidHeapPointer retornará TRUE se o ponteiro especificado estiver no heap compartilhado por todas as instâncias da biblioteca do CRT. Em versões da CRT anteriores ao Visual Studio 2010, essa função retorna 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 erros de _ASSERT 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 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.

Confira também

Rotinas de depuração