Výjimky: Uvolnění objektů v výjimky
Tento článek vysvětluje potřebu a způsob uvolnění objektů, dojde k výjimce.Témata zahrnují:
Zpracování výjimek místně
Vyvolání výjimky po zničení objekty
Výjimek vyvolaných rámce nebo toku normální program přerušení vaší aplikace.Proto je velmi důležité sledovat zavřít objektů tak, aby bylo možné správně vyřazení z nich v případě, že je vyvolána výjimka.
Provést dva primární způsoby.
Zpracovat místně pomocí výjimky akci a úlovku klíčová slova, pak zničit všechny objekty s jedním příkazem.
Zničit libovolný objekt úlovku bloku před vyvolání výjimky mimo blok pro další zpracování.
Tyto dva přístupy jsou popsány dále jako řešení problematických následující příklad:
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;
}
Zapsaný výše, myPerson nebude odstraněn, pokud je vyvolána výjimka SomeFunc.Spuštění, přejde přímo na další zpracování výjimek vnější vynechání konec normální funkce a kód, který odstraní objekt.Ukazatel na objekt dostane mimo rozsah funkce opustí výjimku a paměti obsazené objektu budou obnoveny nikdy jako je program spuštěn.Toto je nevracení paměti; by být zjištěny pomocí nástroje Diagnostika paměti.
Zpracování výjimek místně
Try/catch paradigma poskytuje obranný programovací metody pro zabránění nevracení paměti a zajištění, že objekty jsou zničeny při výskytu výjimek.Příklad výše v tomto článku, nelze přepsat 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í popisovač výjimky výjimku zachytit a zpracovat ji místně.Potom obvykle ukončí funkce a ničí objektu.Důležitým aspektem tohoto příkladu je odpovídá kontextu zachytit výjimku try/catch bloky.Bez výjimky místní rámečku funkce by nikdy vědět, kdyby byla vyvolána výjimku a nemáte šanci ukončit normálně a zničení objektu.
Vyvolání výjimky po zničení objekty
Dalším způsobem zpracování výjimek je předat k další vnější souvislosti zpracování výjimek.Ve vaší úlovku bloku, můžete provést některé čištění místně přidělené objekty a potom vyvoláním výjimky pro další zpracování.
Funkce throwing nebo není třeba navrátit haldy objekty.Pokud funkce vždy zruší přidělení haldy objekt před návratem v případě normální, pak funkce by také navrátit haldy objekt před vyvolání výjimky.Na druhé straně Pokud funkce není navrátit obvykle objekt před návratem v případě normální, pak musíte rozhodnout případ od případu na základě zda by uvolnit objekt haldy.
Následující příklad ukazuje, jak místně alokované objekty 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ýjimka automaticky zruší přidělení objekty rámce; Zkratka destruktoru rámeček objektu.
Při volání funkce, které lze vyvolat výjimek, můžete použít try/catch bloky k zachycení výjimek a šanci zničit všechny objekty, které jste vytvořili.Zejména Uvědomte si, že mnoho funkcí MFC lze vyvolat výjimek.
Další informace naleznete v výjimky: výjimky odlovy a odstraňování.