Declarações de CRT
This topic applies to:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Native only |
||||
Pro, Premium e Ultimate |
Native only |
CRTDBG.Arquivo de cabeçalho h define o macros _ASSERT e _ASSERTE de verificação de declaração.
Macro |
Result |
---|---|
_ASSERT |
Se a expressão especificada for avaliada como FALSE, o arquivo nome e número da linha de _ASSERT. |
_ASSERTE |
Mesmo que _ASSERT, além de uma representação de seqüência da expressão que foi declarada. |
_ASSERTEé mais eficiente porque ele informa que a expressão de confirmado representavam falso. Isso pode ser suficiente para identificar o problema sem fazer referência ao código-fonte. No entanto, a versão de depuração do aplicativo conterá uma constante de seqüência de caracteres para cada expressão declarada usando _ASSERTE. Se você usar muitos _ASSERTE macros, essas expressões de seqüência de caracteres ocupam uma quantidade significativa de memória. Se o que prova para ser um problema, use _ASSERT para economizar memória.
Quando _ Debug for definido, o _ASSERTE macro é definida da seguinte maneira:
#define _ASSERTE(expr) \
do { \
if (!(expr) && (1 == _CrtDbgReport( \
_CRT_ASSERT, __FILE__, __LINE__, #expr))) \
_CrtDbgBreak(); \
} while (0)
Se a expressão confirmada for avaliada como FALSE, _CrtDbgReport é chamado para relatar a falha de declaração (usando uma caixa de diálogo de mensagem por padrão). Se você escolher novamente na caixa de diálogo de mensagem, _CrtDbgReport retorna 1 e _CrtDbgBreak chama o depurador por meio de DebugBreak.
Substituindo printf
_ASSERTEpermite que você substitua o código a seguir:
#ifdef _DEBUG
if ( someVar > MAX_SOMEVAR )
printf( "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n",
someVar, otherVar );
#endif
com uma única instrução:
_ASSERTE(someVar <= MAX_SOMEVAR);
Verificação de corrupção de Heap
O exemplo a seguir usa _CrtCheckMemory para verificar se há corrupção da pilha:
_ASSERTE(_CrtCheckMemory());
Verificando a validade do ponteiro
O exemplo a seguir usa _CrtIsValidPointer para verificar se um intervalo determinado de memória é válido para leitura ou gravação.
_ASSERTE(_CrtIsValidPointer( address, size, TRUE );
O exemplo a seguir usa _CrtIsValidHeapPointer para verificar um ponteiro aponta para a memória no heap de local (pilha criado e gerenciado por esta instância da biblioteca c run-time — uma DLL pode ter sua própria instância da biblioteca e, portanto, sua própria pilha, fora do heap do aplicativo). Essa afirmação não captura apenas nula ou endereços out-of-bounds, mas também os ponteiros para variáveis estáticas, variáveis de pilha e nenhuma outra memória não-local.
_ASSERTE(_CrtIsValidPointer( myData );
A verificação de um bloco de memória
O exemplo a seguir usa _CrtIsMemoryBlock para verificar que um bloco de memória heap local e possui um tipo de bloco válido.
_ASSERTE(_CrtIsMemoryBlock (myData, size, &requestNumber, &filename, &linenumber));