예외: 예외 개체를 해제합니다.
필요성 및 예외가 발생 했을 때 개체를 해제 하는 방법을 설명 합니다.다음 내용을 다룹니다.
로컬에서 예외를 처리합니다.
개체 파괴 후 예외를 throw 합니다.
프레임 워크 나 응용 프로그램 인터럽트 정상적인 프로그램 흐름을 예외가 발생 합니다.따라서 예외가 throw 된 경우를 제대로 처리할 수 있도록 닫기 개체를 추적 하는 매우 중요 합니다.
이렇게 하려면 두 가지 기본 방법입니다.
로컬로 사용 하 여 예외를 처리는 시도 및 catch 키워드 다음 모든 개체를 하나의 문으로 파괴 하십시오.
모든 개체 파괴는 catch 추가로 처리 블록 외부에서 예외를 throw 하기 전에 차단 합니다.
이러한 두 가지 방법은 아래 해결 방법 문제가 있는 다음 예제와 같습니다.
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;
}
위에 설명 된 대로 myPerson 예외를 throw 하는 경우에 삭제 되지 않습니다 SomeFunc.정상적인 함수 종료 및 개체를 삭제 하는 코드를 사용 하지 않고 직접는 다음 외부 예외 처리기로 실행을 이동 합니다.예외가 함수를 벗어나면 프로그램이 실행 되는 개체에서 사용한 메모리 영영 복구할 때 포인터가 개체 범위를 벗어날.이 메모리 누수가 발생 합니다. 메모리 진단 프로그램을 사용 하 여 감지 됩니다.
로컬에서 예외를 처리합니다.
Try/catch 패러다임은 메모리 누수를 방지 하 고 예외가 발생 하면 사용자 개체를 삭제 하는 것에 대 한 방어 프로그래밍 방법을 제공 합니다.예를 들어,이 문서의 앞부분에 나와 있는 예제 같이 다시 작성할 수 있습니다.
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;
}
새 예제에서는 예외를 catch 하 여 로컬로 처리 하는 예외 처리기를 설정 합니다.다음 함수는 정상적으로 종료 하 고 개체를 삭제 합니다.이 예제에서는 예외를 catch 하는 컨텍스트로 설정 되어 있는지 중요 합니다의 try/catch 블록.로컬 예외 프레임이 없으면 함수는 절대로 예외가 throw 되었다는 하 고 정상적으로 종료 하 고 개체가 파괴 가능성 없는 알 수 있습니다.
개체 파괴 후 예외를 throw 합니다.
다음 외부 예외 처리 컨텍스트로 전달할 예외를 처리할 수 있습니다.에 catch 블록, 일부 로컬로 할당 된 개체의 정리를 수행한 다음 예외를 추가 처리를 위해 throw.
Throw 함수 않거나 힙 개체를 할당 해제할 필요가 없습니다.할당 정상 반환 하기 전에 항상 힙 개체의 함수를 되 면 다음 함수 또한 힙 개체는 예외를 throw 하기 전에 해제 해야 합니다.할당 함수는 일반적으로 개체 정상 반환 하기 전에 취소 하지 않으면 반면, 다음 사용자가 경우에 따라 힙 개체를 할당 취소 여부 결정 해야 합니다.
어떻게 로컬로 할당 된 개체는 다음 예와 정리할 수 있습니다.
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;
}
예외 메커니즘 프레임 개체를 자동으로 할당 취소. 프레임 개체의 소멸자가 호출 됩니다.
예외를 throw 하는 함수를 호출 하는 경우 사용할 수 있습니다 try/catch 블록에서 예외를 catch 하 고 사용자가 만든 모든 개체를 소멸 시킬 기회가 있는지 확인 합니다.특히 많은 MFC 함수 예외를 throw 할 수 있습니다 유의 하십시오.
자세한 내용은 예외: 예외를 삭제 하 고 Catching.