다음을 통해 공유


예외: 예외 개체를 해제합니다.

필요성 및 예외가 발생 했을 때 개체를 해제 하는 방법을 설명 합니다.다음 내용을 다룹니다.

  • 로컬에서 예외를 처리합니다.

  • 개체 파괴 후 예외를 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.

참고 항목

개념

MFC에서 처리 하는 예외