Compartilhar via


Exceções: Liberando objetos nas exceções

Este artigo explica a necessidade e o método de liberação de objetos quando ocorre uma exceção.Os tópicos incluem:

  • Tratamento da exceção localmente

  • Gerar exceções depois de destruir objetos

Exceções lançadas pela estrutura ou pelo seu aplicativo interrupção o fluxo normal do programa.Portanto, é muito importante manter o controle perto dos objetos para que você pode desfazer corretamente de-los no caso de uma exceção é lançada.

Há dois métodos principais para fazer isso.

  • Manipular exceções localmente usando o Tente and catch palavras-chave, em seguida, destruir todos os objetos com uma demonstrativo.

  • Destruir qualquer objeto no catch bloco antes de lançar a exceção fora do bloco para lidar com ainda mais.

Essas duas abordagens são ilustradas abaixo sistema autônomo soluções para o exemplo a seguir problemático:

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

sistema autônomo escritos acima, myPerson não será excluída se uma exceção é lançada por SomeFunc. Execução saltará diretamente para o manipulador de exceção externa próximo, ignorando a sair da função normal e o código exclui o objeto.O ponteiro para o objeto sai do escopo quando a exceção deixa a função e a memória ocupada pelo objeto nunca será recuperada sistema autônomo longo sistema autônomo a execução do programa.Este é um perda de memória; pode ser detectada pelo usando o diagnóstico de memória.

Manipulação da exceção localmente

The try/catch paradigma fornece um método de programação defensivo para evitar vazamentos de memória e garantindo que os objetos são destruídos quando ocorrem exceções.Por exemplo, o exemplo mostrado anteriormente neste artigo poderia ser reescrito sistema autônomo segue:

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

Este exemplo novo configura um manipulador de exceção para capturar a exceção e manipulá-lo localmente.Em seguida, sai da função normalmente e destrói o objeto.O aspecto importante deste exemplo é que um contexto para capturar a exceção é estabelecido com o try/catch blocos.Sem um quadro de exceção do local, a função jamais saberia que uma exceção tivesse sido lançada e não terá a chance de sair normalmente e destruir o objeto.

Lançando exceções após destruindo objetos

Outra maneira de manipular exceções é passá-los em para o contexto de manipulação de exceção externo próximo.No seu catch bloco, você pode fazer uma limpeza de seus objetos alocados localmente e, em seguida, lançar a exceção para processamento posterior.

O lançamento pode funcionar ou não precise desalocar heap objetos.Se a função desaloca sempre o heap de objeto antes de retornar no caso de normal, em seguida, a função deve também desalocar o heap de objeto antes de lançar a exceção.Por Outros lado, se a função normalmente não desalocar o objeto antes de retornar no caso de normal, em seguida, você deverá decidir sobre caso a caso se o objeto de pilha deve ser desalocado.

Mostra o exemplo a seguir alocado localmente como objetos pode ser limpos:

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

O mecanismo de exceção desaloca automaticamente objetos quadro; o destruidor do objeto de quadro também é chamado.

Se você telefonar funções que podem lançar exceções, você pode usar try/catch blocos para certificar-se de capturar as exceções e terá a chance de destruir quaisquer objetos que você criou.Em particular, esteja ciente de que muitas funções do MFC podem lançar exceções.

Para obter mais informações, consulte Exceções: Captura e excluindo exceções.

Consulte também

Conceitos

Exceção Handling in MFC