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.