_CrtSetDbgFlag
Recupera o modifica lo stato del _crtDbgFlag
flag per controllare il comportamento di allocazione del gestore heap di debug (solo versione di debug).
Sintassi
int _CrtSetDbgFlag(
int newFlag
);
Parametri
newFlag
Nuovo stato per _crtDbgFlag
.
Valore restituito
Restituisce lo stato precedente di _crtDbgFlag
.
Osservazioni:
La _CrtSetDbgFlag
funzione consente all'applicazione di controllare il modo in cui il gestore heap di debug tiene traccia delle allocazioni di memoria modificando i campi di bit del _crtDbgFlag
flag. Impostando i campi di bit, l'applicazione può indicare al gestore dell'heap di debug di eseguire operazioni di debug speciali. Esistono diverse operazioni possibili:
- Verifica della presenza di perdite di memoria quando l'applicazione viene chiusa e segnala se sono presenti,
- Simulazione di condizioni di memoria insufficiente specificando che i blocchi di memoria liberati devono rimanere nell'elenco collegato dell'heap,
- Verifica dell'integrità dell'heap controllando ogni blocco di memoria in ogni richiesta di allocazione.
Quando _DEBUG
non è definito, le chiamate a _CrtSetDbgFlag
vengono rimosse durante la pre-elaborazione.
La tabella seguente elenca i campi di bit per _crtDbgFlag
e ne descrive il comportamento. Poiché l'impostazione dei bit comporta un aumento dell'output di diagnostica e una riduzione della velocità di esecuzione del programma, questi bit non vengono impostati (disattivati) per impostazione predefinita. Per altre informazioni su questi campi di bit, vedere Funzioni di creazione di report sullo stato dell'heap.
Campo di bit | Default | Descrizione |
---|---|---|
_CRTDBG_ALLOC_MEM_DF |
In... | ON: attiva le allocazioni dell'heap di debug e l'uso di identificatori del tipo di blocco di memoria, ad esempio _CLIENT_BLOCK . OFF: aggiungere nuove allocazioni all'elenco collegato dell'heap, ma impostare il tipo di blocco su _IGNORE_BLOCK .È anche possibile usare in combinazione le macro del controllo frequenza heap. |
_CRTDBG_CHECK_ALWAYS_DF |
OFF | ON: Chiamare _CrtCheckMemory a ogni richiesta di allocazione e deallocazione. OFF: la funzione _CrtCheckMemory deve essere chiamata in modo esplicito.Quando viene impostato questo flag, le macro del controllo frequenza heap non hanno alcun effetto. |
_CRTDBG_CHECK_CRT_DF |
OFF | ON: include i tipi _CRT_BLOCK nelle operazioni di rilevamento di perdite e differenze tra gli stati della memoria. OFF: la memoria usata internamente dalla libreria di runtime viene ignorata da queste operazioni.È anche possibile usare in combinazione le macro del controllo frequenza heap. |
_CRTDBG_DELAY_FREE_MEM_DF |
OFF | ON: mantenere i blocchi di memoria liberati nell'elenco collegato dell'heap, assegnarli al _FREE_BLOCK tipo e riempirli con il valore di byte 0xDD. OFF: non mantenere blocchi liberati nell'elenco collegato dell'heap.È anche possibile usare in combinazione le macro del controllo frequenza heap. |
_CRTDBG_LEAK_CHECK_DF |
OFF | ON: eseguire il controllo automatico delle perdite all'uscita del programma tramite una chiamata a _CrtDumpMemoryLeaks e generare una segnalazione errori se l'applicazione non è riuscita a liberare tutta la memoria allocata. OFF: non eseguire automaticamente il controllo delle perdite all'uscita del programma.È anche possibile usare in combinazione le macro del controllo frequenza heap. |
Macro di controllo della frequenza dell'heap
È possibile specificare la frequenza con cui la libreria di runtime C esegue la convalida dell'heap di debug (_CrtCheckMemory
) in base al numero di chiamate a malloc
, realloc
free
, e _msize
.
_CrtSetDbgFlag
cerca quindi un valore nei 16 bit superiori del parametro newFlag
. Il valore specificato è il numero di malloc
chiamate free
, realloc
, e _msize
tra _CrtCheckMemory
le chiamate. A questo scopo sono disponibili quattro macro predefinite.
Macro | Numero di malloc chiamate , realloc , free e _msize tra le chiamate a _CrtCheckMemory |
---|---|
_CRTDBG_CHECK_EVERY_16_DF |
16 |
_CRTDBG_CHECK_EVERY_128_DF |
128 |
_CRTDBG_CHECK_EVERY_1024_DF |
1024 |
_CRTDBG_CHECK_DEFAULT_DF |
0 (per impostazione predefinita, nessun controllo dell'heap) |
Per impostazione predefinita, _CrtCheckMemory
non viene chiamato durante le operazioni di memoria. È possibile modificarlo inviando i flag illustrati in precedenza a _CrtSetDbgFlag()
.
Ad esempio, è possibile specificare un controllo dell'heap ogni 16 malloc
operazioni , realloc
, free
, e _msize
con il codice seguente:
#include <crtdbg.h>
int main( )
{
int tmp;
// Get the current bits
tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
// Clear the upper 16 bits and OR in the desired frequency
tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;
// Set the new bits
_CrtSetDbgFlag(tmp);
}
I 16 bit superiori del newFlag
parametro vengono ignorati quando _CRTDBG_CHECK_ALWAYS_DF
viene specificato. In questo caso, _CrtCheckMemory
viene chiamato ogni volta che si chiama malloc
, free
realloc
, e _msize
.
newFlag
è il nuovo stato da applicare a _crtDbgFlag
e è una combinazione dei valori per ognuno dei campi di bit.
Per modificare uno più campi di bit e creare un nuovo stato per il flag
Chiamare
_CrtSetDbgFlag
connewFlag
uguale a_CRTDBG_REPORT_FLAG
per ottenere lo stato corrente_crtDbgFlag
e archiviare il valore restituito in una variabile temporanea.Attivare tutti i bit da un "or" bit per bit (
|
) della variabile temporanea con le maschera di bit corrispondenti (rappresentate nel codice dell'applicazione da costanti manifesto).Disattivare gli altri bit con un bit per bit "and" (
&
) della variabile con un bit per bit "not" (~
) delle maschera di bit appropriate.Chiamare
_CrtSetDbgFlag
connewFlag
uguale al valore archiviato nella variabile temporanea per impostare il nuovo stato per_crtDbgFlag
.
Il codice seguente illustra come simulare condizioni di memoria insufficiente mantenendo i blocchi di memoria liberati nell'elenco collegato dell'heap e impedire che la funzione _CrtCheckMemory
venga chiamata a ogni richiesta di allocazione:
// Get the current state of the flag
// and store it in a temporary variable
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
// Turn On (OR) - Keep freed memory blocks in the
// heap's linked list and mark them as freed
tmpFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
// Turn Off (AND) - prevent _CrtCheckMemory from
// being called at every allocation request
tmpFlag &= ~_CRTDBG_CHECK_ALWAYS_DF;
// Set the new state for the flag
_CrtSetDbgFlag( tmpFlag );
Per una panoramica della gestione della memoria e dell'heap di debug, vedere Dettagli dell'heap di debug CRT.
Per disabilitare un flag con la _CrtSetDbgFlag
funzione , usare un bit per bit "and" (&
) della variabile con la "not" bit per bit (~
) della maschera di bit.
Se newFlag
non è un valore valido, questa funzione richiama il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, la funzione imposta errno
su EINVAL
e restituisce lo stato precedente di _crtDbgFlag
.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_CrtSetDbgFlag |
<crtdbg.h> |
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Librerie
Solo le versioni di debug delle librerie di runtime di C.
Esempio
// crt_crtsetdflag.c
// compile with: /c -D_DEBUG /MTd -Od -Zi -W3 /link -verbose:lib /debug
// This program concentrates on allocating and freeing memory
// blocks to test the functionality of the _crtDbgFlag flag.
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
int main( )
{
char *p1, *p2;
int tmpDbgFlag;
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
// Set the debug-heap flag to keep freed blocks in the
// heap's linked list - This will allow us to catch any
// inadvertent use of freed memory
tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpDbgFlag);
// Allocate 2 memory blocks and store a string in each
p1 = malloc( 34 );
p2 = malloc( 38 );
strcpy_s( p1, 34, "p1 points to a Normal allocation block" );
strcpy_s( p2, 38, "p2 points to a Client allocation block" );
// Free both memory blocks
free( p2 );
free( p1 );
// Set the debug-heap flag to no longer keep freed blocks in the
// heap's linked list and turn on Debug type allocations (CLIENT)
tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpDbgFlag |= _CRTDBG_ALLOC_MEM_DF;
tmpDbgFlag &= ~_CRTDBG_DELAY_FREE_MEM_DF;
_CrtSetDbgFlag(tmpDbgFlag);
// Explicitly call _malloc_dbg to obtain the filename and
// line number of our allocation request and also so we can
// allocate CLIENT type blocks specifically for tracking
p1 = _malloc_dbg( 40, _NORMAL_BLOCK, __FILE__, __LINE__ );
p2 = _malloc_dbg( 40, _CLIENT_BLOCK, __FILE__, __LINE__ );
strcpy_s( p1, 40, "p1 points to a Normal allocation block" );
strcpy_s( p2, 40, "p2 points to a Client allocation block" );
// _free_dbg must be called to free the CLIENT block
_free_dbg( p2, _CLIENT_BLOCK );
free( p1 );
// Allocate p1 again and then exit - this will leave unfreed
// memory on the heap
p1 = malloc( 10 );
}