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 checkAlwaysMemDF
vynutí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 AfxCheckMemory
vlastní volání () tak, jak je uvedeno výše, a pokusit se izolovat paměť tímto způsobem.