Sdílet prostřednictvím


_CrtSetDbgFlag

Načítá nebo upravuje stav _crtDbgFlag příznak, který řídí chování přidělení haldy správce ladění (pouze verze ladění).

int _CrtSetDbgFlag(     int newFlag  );

Parametry

  • newFlag
    Nový stav pro _crtDbgFlag.

Vrácená hodnota

Vrátí předchozí stav _crtDbgFlag.

Poznámky

_CrtSetDbgFlag Funkce umožňuje aplikaci tak, aby určit, jak správce haldy ladění sleduje přidělení paměti změnou oblasti bit _crtDbgFlag příznak.Nastavením bitů (zapnutí) aplikace můžete dát pokyn, správce haldy ladění k provedení operace speciální ladění, včetně probíhá kontrola nevracením paměti při ukončení aplikace a generování sestav-li nějaké nalezeny, tak, že určíte, že bloky uvolněné paměti, musí zůstat v odkazovaného seznamu do haldy a ověření integrity haldy kontrolou každého bloku paměti na každý požadavek na přidělení simulaci nedostatku paměti.Když není příznak _DEBUG definován, jsou volání funkce _CrtSetDbgFlag odstraněna během předběžného zpracování.

V následující tabulce jsou uvedeny bit pole pro _crtDbgFlag a popisuje jejich chování.Vzhledem k tomu, že nastavení bitů výsledky v zvýšená výstup diagnostiky a rychlost vykonávání programu nižšími, nejsou nastaveny těchto bitů (vypnuté) ve výchozím nastavení.Další informace o těchto bit polí naleznete v tématu funkce hlášení stavu haldy.

Bitové pole

Výchozí

Popis

_CRTDBG_ALLOC_MEM_DF

DÁLE

ON: Povolit přidělení haldy ladění a využívání paměti identifikátory typu block, jako je například _CLIENT_BLOCK.OFF: Přidat nové přidělení haldy odkazovaného seznamu, ale nastavit typ do bloku _IGNORE_BLOCK.

Lze také kombinovat s některou z makra kontroly haldy frekvence.

_CRTDBG_CHECK_ALWAYS_DF

VYPNOUT

NA: Volání _CrtCheckMemory na každý požadavek přidělené a odebrané.OFF: _CrtCheckMemory musí být explicitně volána.

Makra kontroly haldy frekvence nemají žádný vliv, pokud je tento příznak nastavena.

_CRTDBG_CHECK_CRT_DF

VYPNOUT

ON: Zahrnout _CRT_BLOCK typy v nevracení paměti a zjišťování stavu rozdíl operace.VYPNOUT: Paměti používáno interně průvodcem knihovna run-time ignorovala těchto operací.

Lze také kombinovat s některou z makra kontroly haldy frekvence.

_CRTDBG_DELAY_FREE_MEM_DF

VYPNOUT

DÁLE: Zachování uvolnění paměti bloky haldy je propojena seznamu, je přiřadit _FREE_BLOCK zadejte a vyplnit hodnotu bajtu 0xDD.VYPNOUT: Není mějte uvolněné bloky odkazovaného seznamu do haldy.

Lze také kombinovat s některou z makra kontroly haldy frekvence.

_CRTDBG_LEAK_CHECK_DF

VYPNOUT

DÁLE: Provádět automatické nevracení kontrolu při ukončení programu prostřednictvím volání do _CrtDumpMemoryLeaks a generování zprávy o chybách, je-li aplikaci se nepodařilo uvolnit všechny jeho přidělené paměti.VYPNUTO: Neprovádějte automaticky nevracení kontrolu při ukončení programu.

Lze také kombinovat s některou z makra kontroly haldy frekvence.

Kontrola haldy frekvence makra

Můžete určit, jak často C run-time library provede ověření haldy ladění (_CrtCheckMemory) na základě počtu volání malloc, realloc, zdarma, a _msize.

_CrtSetDbgFlagpoté prohlíží horní 16 bitů newFlag parametr pro hodnotu.Zadaná hodnota je počet malloc, realloc, zdarma, a _msize volá mezi _CrtCheckMemory volání.Čtyři předdefinované makra jsou k dispozici pro tento účel.

Makra

Počet přidělit, realloc, zdarma a _msize volání mezi volání _CrtCheckMemory

_CRTDBG_CHECK_EVERY_16_DF

16

_CRTDBG_CHECK_EVERY_128_DF

128

_CRTDBG_CHECK_EVERY_1024_DF

1024

_CRTDBG_CHECK_DEFAULT_DF

0 (ve výchozím nastavení žádné kontroly haldy)

Ve výchozím nastavení _CrtCheckMemory je volána poté, co každý 1 024 časy zavoláte malloc, realloc, zdarma, a _msize.

Například můžete zadat haldy zkontrolujte každých 16 malloc, realloc, zdarma, a _msize operace s následujícím kódem:

#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 freqency
tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;

// Set the new bits
_CrtSetDbgFlag(tmp);
}

Horní 16 bitů newFlag parametru jsou ignorovány, pokud je zadán _CRTDBG_CHECK_ALWAYS_DF.V takovém případě _CrtCheckMemory je volána pokaždé, když zavoláte malloc, realloc, zdarma, a _msize.

newFlagje nový stav mají být použity _crtDbgFlag a je kombinací hodnot pro každé pole bitů.

Chcete-li změnit jeden nebo více z těchto polí bit a vytvořte nový stav pro příznak

  1. Volání _CrtSetDbgFlag s newFlag rovná _CRTDBG_REPORT_FLAG Chcete-li získat aktuální _crtDbgFlag stav a uložte vrácené hodnoty v dočasné proměnné.

  2. Zapnout jakékoli bitů podle OR- sestav dočasné proměnné s odpovídající bitovou masku (představované v kódu aplikace manifestu konstanty).

  3. Vypnout bitů podle a- sestav proměnné s bitová není z příslušné bitovou masku.

  4. Volání _CrtSetDbgFlag s newFlag rovná hodnota uložená v dočasné proměnné nastavit nový stav pro _crtDbgFlag.

Následující kód ukazuje, jak simulovat nedostatku paměti podmínky udržováním uvolnění paměti bloků v odkazovaného seznamu do haldy a zabránit _CrtCheckMemory z volána na každý požadavek na přidělení:

// 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 );

Přehled správy paměti a ladění haldy, naleznete v části Podrobnosti haldy ladění CRT.

Zakázání příznaku s _CrtSetDbgFlag funkce, měli byste a proměnné s bitové hodnotě není z maskování bitů.

Pokud newFlag není platná hodnota, tato funkce vyvolá obslužnou rutinu neplatný parametr, jak je popsáno v Ověření parametru.Pokud je povoleno spuštění chcete-li pokračovat, tato funkce nastaví errno k EINVAL a vrátí do předchozího stavu _crtDbgFlag.

Požadavky

Rutina

Požadovaný hlavičkový soubor

_CrtSetDbgFlag

< crtdbg.h >

Další informace o kompatibilitě, podívejte se na téma kompatibility v zavedení.

Knihovny

Ladicí verze knihoven C run-time pouze.

Příklad

// 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 );
}

Ekvivalent v rozhraní .NET Framework

Nelze použít. Pokud chcete volat standardní funkci jazyka C, použijte PInvoke. Další informace naleznete v tématu příklady vyvolat platformy.

Viz také

Referenční dokumentace

Rutiny ladění

_crtDbgFlag

_CrtCheckMemory