Sdílet prostřednictvím


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.

Viz také

Koncepty

Zpracování výjimek v prostředí MFC