Udostępnij za pośrednictwem


Wyjątki: Zwalnianie obiektów w wyjątków

W tym artykule wyjaśniono, potrzeby i metoda zwalniania obiektów, gdy wystąpi wyjątek.Tematy obejmują:

  • Obsługa wyjątków w lokalnie

  • Wyrzucanie wyjątków od niszczących obiekty

Wyjątki generowane przez ramach lub przez użytkownika aplikacji przerwania normalnego program przepływu.Dlatego jest bardzo ważne, aby szczegółowe śledzenie obiekty, tak aby można właściwie zbycia ich w przypadku, gdy jest wyjątek.

Istnieją dwie podstawowe metody, w tym celu.

  • Obsługi wyjątków lokalnie przy użyciu Spróbuj i połowu słowa kluczowe, następnie zniszczyć wszystkie obiekty z jednej instrukcji.

  • Zniszczenie dowolnego obiektu w połowu bloku przed wyrzucanie wyjątków poza blokiem do dalszej obróbki.

Te dwa podejścia zilustrowane poniżej jako rozwiązania problematyczne poniższy przykład:

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 zapisane powyżej, myPerson nie zostanie usunięty, jeśli wyjątek przez SomeFunc.Wykonywanie przechodzi bezpośrednio do następnego obsługi wyjątków zewnętrznej, pomijając exit normalnej funkcji i kod, który usuwa obiekt.Wskaźnik na obiekt wykracza poza zakres wyjątku pozostawia funkcję i pamięci zajmowanego przez obiekt nigdy nie zostanie odzyskana, jak długo program jest uruchomiony.To jest przeciek pamięci; Każde pozwolenie na wywóz mogłoby być wykrywane przez diagnostykę pamięci.

Obsługa wyjątków w lokalnie

Try/catch paradygmat zapewnia obronnych metody programowania dla uniknięcia przecieków pamięci i zapewnienie, że obiekty są niszczone w wystąpieniu wyjątku.Na przykład przykładzie wcześniej w tym artykule może przepisywane w następujący sposób:

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;
}

W tym przykładzie nową ustanawia procedury obsługi wyjątków do połowu wyjątek i traktować go lokalnie.Następnie zwykle kończy działanie funkcji i niszczy obiekt.Ważnym aspektem w tym przykładzie jest, że kontekst do połowu wyjątek jest ustalana z try/catch bloków.Bez wyjątku lokalnych ramki funkcja będzie nigdy nie wiedział, że wyjątek miał został zgłoszony nie miałoby szansę wyjść normalnie i zniszczyć obiekt.

Wyrzucanie wyjątków od niszczących obiekty

Innym sposobem obsługi wyjątków jest przekazać je dalej zewnętrzne kontekst obsługi wyjątków.W sieci połowu bloku, można porządki lokalnie przydzielonego obiektów i następnie throw wyjątek dla dalszego przetwarzania.

Funkcja throwing może lub nie trzeba cofnąć alokację sterty obiektów.Jeśli funkcja zawsze zwalnia obiektu sterty przed zwróceniem w przypadku normalnego, a następnie funkcja powinna również deallocate obiektu sterty przed wyrzuceniem wyjątek.Z drugiej strony Jeśli funkcja przed zwróceniem w normalnych przypadkach nie cofnąć zwykle obiekt, następnie należy zdecydować na podstawie indywidualnych przypadków czy powinna cofniętych przydziałów obiektu sterty.

W poniższym przykładzie jak lokalnie przydzielone obiekty mogą zostać oczyszczone:

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;
}

Mechanizm wyjątek automatycznie zwalnia ramki obiektów; Skrót destruktora ramki obiektu.

Jeśli wywołania funkcji, które można generują wyjątki można try/catch bloki, aby przechwytywać wyjątków oraz mają szansę, aby zniszczyć wszystkie obiekty, które zostały utworzone.W szczególności należy pamiętać, że wiele funkcji MFC można generują wyjątki.

Aby uzyskać więcej informacji, zobacz wyjątki: połowu i usuwanie wyjątki.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC