Výjimky: Uvolnění objektů ve výjimkách
Tento článek vysvětluje potřebu a způsob uvolnění objektů, pokud dojde k výjimce.Témata zahrnují:
Zpracování výjimek v místním počítači
Vyvolání výjimky po zničení objekty
Výjimek vyvolaných rámcem nebo ve vaší aplikaci přerušení normálního toku programu.Proto je velmi důležité detailně sledovat objekty, takže se můžete správně vyřazení z nich v případě, že je vyvolána výjimka.
K tomu dva primární způsoby.
Zpracování výjimek místně s použitím akci a ve skutečné klíčová slova, pak zničit všechny objekty pomocí jednoho příkazu.
Zničit libovolný objekt v ve skutečné blok před vyvoláním výjimky mimo blok pro další zpracování.
Tyto dva přístupy jsou popsány dále, jako v následujícím příkladu problematické řešení:
void SomeFunc() // Problematic code
{
CPerson* myPerson = new CPerson;
// Do something that might throw an exception.
myPerson->SomeFunc();
// Now destroy the object before exiting.
// If SomeFunc above throws an exception this code will
// not be reached and myPerson will not be deleted.
delete myPerson;
}
Jak je napsána, myPerson nebudou odstraněny, pokud je vyvolána výjimka v SomeFunc.Spuštění přejde na další vnější obslužná rutina výjimky, konec normální funkce a kód, který odstraní objekt přímo.Ukazatel na objekt je mimo rozsah výjimku opouští funkci a budou tak dlouho, dokud je spuštěn program nikdy obnoveny paměti obsazené ovladačem objektu.To je nevrácená paměť; by být zjištěno pomocí diagnostiky paměti.
Zpracování výjimek v místním počítači
Try/catch paradigma představuje obranný způsob programování pro zabránění úniku informací z paměti a zajistit, že objekty jsou zničeny při výskytu výjimek.Například v příkladu uvedené dříve v tomto článku by mohla být přepsána takto:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
// Handle the exception locally
e->Delete();
}
// Now destroy the object before exiting.
delete myPerson;
}
Tento nový příklad nastaví obslužnou rutinu výjimky pro zachycení výjimky a zpracování místně.Pak obvykle ukončí funkci a ničí objektu.Důležitým aspektem tohoto příkladu je odpovídá kontextu zachytit výjimku try/catch bloky.Bez rámečku místní výjimky by funkci nikdy vědět, že výjimka byla vyvolána výjimka a nebude mít možnost ukončit normálně a zničení objektu.
Vyvolání výjimky po zničení objekty
Další způsob zpracování výjimek je je předat dalším vnějšího kontextu zpracování výjimek.Ve své skutečné blok, můžete provést některé čištění místně přidělené objektů a poté vyvolat výjimku pro další zpracování.
Aktivační funkce může nebo nemusí být nutné přidělení haldy objektů.Pokud funkce vždy zruší přidělení haldy objektu před návratem v normálním případě, potom funkce by měl také navrátit objekt haldy před vyvoláním výjimky.Na druhé straně Pokud funkce není navrátit obvykle objekt před návratem v normálním případě, pak je třeba rozhodnout případ od případu zda objekt haldy navrácení média.
Následující příklad ukazuje, jak místně přidělených objektů lze vyčistit:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
e->ReportError();
// Destroy the object before passing exception on.
delete myPerson;
// Throw the exception to the next handler.
throw;
}
// On normal exits, destroy the object.
delete myPerson;
}
Mechanismus výjimek automaticky zruší přidělení rámečku objekty; destruktor objektu rámce je rovněž používán termín.
Při volání funkce, které mohou vyvolat výjimky, můžete použít try/catch bloky zachytit výjimky a šance, že zničí všechny objekty, které jste vytvořili.Zejména Uvědomte si, že mnoho funkcí knihovny MFC lze vyvolat výjimky.
Další informace naleznete v tématu výjimky: zachycení a odstranění výjimky.