Sdílet prostřednictvím


Kontrola přepisování paměti použitím ladění sestavení

Pokud chcete použít sestavení ladění ke kontrole přepsání paměti, musíte nejprve znovu sestavit projekt pro ladění. Pak přejděte na začátek funkce vaší aplikace InitInstance a přidejte následující řádek:

afxMemDF |= checkAlwaysMemDF;

Alokátor paměti ladění umístí ochranné bajty kolem všech přidělení paměti. Tyto bajty strážných bajtů ale nedělají nic dobrého, pokud nezkontrolujete, jestli byly změněny (což by značilo přepsání paměti). Jinak to jen poskytuje vyrovnávací paměť, která by ve skutečnosti mohla umožnit, abyste se dostali pryč s přepsáním paměti.

Zapnutím této funkce checkAlwaysMemDFvynutíte, aby mfc provedl volání AfxCheckMemory funkce při každém volání nebo delete provedení volánínew. Pokud se zjistilo přepsání paměti, vygeneruje se zpráva TRACE, která vypadá nějak takto:

Damage Occurred! Block=0x5533

Pokud se zobrazí jedna z těchto zpráv, musíte procházet kód, abyste zjistili, kde došlo k poškození. Pokud chcete přesněji izolovat, kde došlo k přepsání paměti, můžete provést explicitní volání AfxCheckMemory sami sobě. Příklad:

ASSERT(AfxCheckMemory());
    DoABunchOfStuff();
    ASSERT(AfxCheckMemory());

Pokud první assert proběhne úspěšně a druhý selže, znamená to, že mezi těmito dvěma voláními muselo dojít k přepsání paměti.

V závislosti na povaze aplikace může dojít k tomu, že afxMemDF program běží příliš pomalu, aby dokonce testovat. Proměnná afxMemDF způsobí AfxCheckMemory volání pro každé volání nového a odstranění. V takovém případě byste měli bodovat AfxCheckMemoryvlastní volání () tak, jak je uvedeno výše, a pokusit se izolovat paměť tímto způsobem.

Viz také

Oprava problémů se sestavením pro vydání