Sdílet prostřednictvím


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í.

Viz také

Koncepty

Zpracování výjimek v MFC