Condividi tramite


Asserzioni CRT

Le informazioni contenute in questo argomento sono valide per:

Edizione

Visual Basic

C#

F#

C++

Web Developer

Express

Argomento non applicabile Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Pro, Premium e Ultimate

Argomento non applicabile Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Il file di intestazione CRTDBG.H definisce le macro _ASSERT e _ASSERTE per il controllo delle asserzioni.

Macro

Risultato

_ASSERT

Se l'espressione specificata ha valore FALSE, il nome file e il numero di riga di _ASSERT.

_ASSERTE

Come _ASSERT, con l'aggiunta della rappresentazione in formato stringa dell'espressione asserita.

_ASSERTE è più potente perché riporta l'espressione asserita che è stata valutata FALSE. Ciò può essere sufficiente per identificare il problema senza fare riferimento al codice sorgente. La versione di debug dell'applicazione conterrà tuttavia una costante stringa per ciascuna espressione asserita mediante _ASSERTE. Se si utilizzano numerose macro _ASSERTE, queste espressioni in formato stringa richiederanno una notevole quantità di memoria. Se questo costituisce un problema, utilizzare _ASSERT per risparmiare memoria.

Quando _DEBUG è definito, la macro _ASSERTE viene definita come segue:

#define _ASSERTE(expr) \
   do { \
      if (!(expr) && (1 == _CrtDbgReport( \
         _CRT_ASSERT, __FILE__, __LINE__, #expr))) \
         _CrtDbgBreak(); \
   } while (0)

Se l'espressione asserita ha valore FALSE, verrà chiamato _CrtDbgReport per fornire informazioni sull'esito negativo dell'asserzione (utilizzando una finestra di dialogo per impostazione predefinita). Se si sceglie Riprova nella finestra di messaggio, _CrtDbgReport restituirà 1 e _CrtDbgBreak chiamerà il debugger tramite DebugBreak.

Sostituzione di printf

_ASSERTE consente di sostituire il codice che segue:

#ifdef _DEBUG
   if ( someVar > MAX_SOMEVAR )
      printf( "OVERFLOW! In NameOfThisFunc( ),
               someVar=%d, otherVar=%d.\n",
               someVar, otherVar );
#endif

con un'unica istruzione:

_ASSERTE(someVar <= MAX_SOMEVAR);

Controllo dell'integrità della memoria heap

L'esempio che segue utilizza _CrtCheckMemory per verificare la presenza di eventuali problemi della memoria heap:

_ASSERTE(_CrtCheckMemory());

Verifica della validità del puntatore

L'esempio che segue utilizza _CrtIsValidPointer per controllare che un determinato intervallo di memoria sia valido per la lettura o la scrittura.

_ASSERTE(_CrtIsValidPointer( address, size, TRUE );

L'esempio che segue utilizza _CrtIsValidHeapPointer per verificare che un puntatore punti a memoria presente nell'heap locale, ovvero all'heap creato e gestito da questa istanza della libreria di runtime del linguaggio C. Una DLL può avere la propria istanza della libreria, e pertanto il proprio heap, all'esterno dell'heap dell'applicazione. Questa asserzione rileva non solo gli indirizzi nulli o esterni ai limiti, ma anche i puntatori a variabili statiche, variabili di stack e altre locazioni di memoria non locali.

_ASSERTE(_CrtIsValidPointer( myData );

Controllo di un blocco di memoria

L'esempio che segue utilizza _CrtIsMemoryBlock per verificare che un blocco di memoria si trovi nell'heap locale e presenti un tipo di blocco valido.

_ASSERTE(_CrtIsMemoryBlock (myData, size, &requestNumber, &filename, &linenumber));

Vedere anche

Concetti

Asserzioni