Udostępnij za pośrednictwem


Wyjątki: zwalnianie obiektów w wyjątkach

Ten artykuł wyjaśnia potrzebę i metoda zwalniania obiektów, gdy wystąpi wyjątek.Tematy obejmują:

  • Obsługa wyjątków w lokalnie

  • Generowania wyjątków po zniszczeniu obiektów

Wyjątki generowane przez ramach lub Przepływ normalny program przerwania aplikacji.Tak więc jest bardzo ważne, aby szczegółowe śledzenie obiektów, tak aby można odpowiednio dysponować z nich w przypadku 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, a następnie zniszczyć wszystkie obiekty z jednej instrukcji.

  • Zniszczyć dowolnego obiektu w połowu bloku przed wyrzuceniem wyjątku poza blokiem do dalszej obróbki.

Te dwa podejścia zostały zilustrowane poniżej jako rozwiązania na poniższym przykładzie problematyczne:

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 napisano powyżej, myPerson nie zostaną usunięte, jeśli wyjątek przez SomeFunc.Wykonanie przechodzi bezpośrednio do następnego Obsługa wyjątków zewnętrznej, z pominięciem exit normalnego funkcjonowania i kod, który usuwa obiekt.Wskaźnik do obiektu wykracza poza zakres wyjątku pozostawia funkcję i nigdy nie będzie można odzyskać zajmowanego przez obiekt pamięć, tak długo, jak długo dany program jest uruchomiony.To jest przeciek pamięci; Czy można wykryć za pomocą diagnostykę pamięci operacyjnej.

Obsługa wyjątków w lokalnie

Try i catch paradygmat zapewnia obronne metodę programowania unikanie przecieków pamięci i zapewnienie, że obiekty są niszczone w wystąpieniu wyjątku.Na przykład z przykładu w tym artykule może przepisany 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ą konfiguruje moduł obsługi wyjątku do wyłapania wyjątku i traktować go lokalnie.Następnie normalnie kończy działanie funkcji i niszczy obiekt.Ważnym aspektem tego przykładu jest ustanowiono kontekst do wyłapania wyjątku z try i catch bloków.Bez ramki lokalnej wyjątek funkcja nigdy nie będzie wiedział, że wyjątek został rzucony i nie miałoby szansę zamknąć normalnie i zniszczyć obiektu.

Generowania wyjątków po zniszczeniu obiektów

Innym sposobem obsługi wyjątków jest przekazania ich dalej zewnętrzny kontekst obsługi wyjątków.W swojej połowu bloku, można czyszczenie lokalnie przydzielonego obiektów i następnie zgłoszenie wyjątku do dalszego przetwarzania.

Funkcja rzucania może lub nie może wymagać należy cofnąć obiektów stosu.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ątku.Z drugiej strony Jeśli funkcja nie normalnie zwolnić obiektu przed zwróceniem w normalnych przypadkach, następnie należy zdecydować, na podstawie indywidualnych przypadków czy ich alokację sterty obiektu.

W poniższym przykładzie pokazano, jak lokalnie przydzielone obiekty mogą być 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łanie funkcji, które można generują wyjątki, można użyć try i catch bloki, aby upewnić się, że przechwytywać wyjątków i masz szansę, aby zniszczyć wszystkie obiekty 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: wyjątków połowu i usuwania.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC