다음을 통해 공유


컴파일러 오류 C2712

개체 해제가 필요한 함수에서 사용할 __try 수 없음

설명

C2712 오류는 사용하는 /EHsc경우 발생할 수 있으며 구조적 예외 처리가 있는 함수에는 해제(소멸)가 필요한 개체도 있습니다.

가능한 해결 방법:

  • SEH가 필요한 코드를 다른 함수로 이동합니다.

  • SEH를 사용하는 함수를 다시 작성하여 소멸자가 있는 지역 변수 및 매개 변수를 사용하지 않도록 합니다. 생성자 또는 소멸자에 SEH를 사용하지 않습니다.

  • /EHsc 없이 컴파일합니다.

키워드를 사용하여 __event 선언된 메서드를 호출하는 경우에도 C2712 오류가 발생할 수 있습니다. 이벤트가 다중 스레드 환경에서 사용될 수 있으므로 컴파일러는 기본 이벤트 개체의 조작을 방지하는 코드를 생성한 다음 생성된 코드를 SEH try-finally에 묶습니다. 따라서 이벤트 메서드를 호출하고 해당 형식에 소멸자가 포함된 인수를 값으로 전달하는 경우 C2712 오류가 발생합니다. 이 경우 한 가지 해결 방법은 인수를 상수 참조로 전달하는 것입니다.

C2712는 블록에서 __try 포인터-함수의 정적 배열을 컴파일 /clr:pure 하고 선언하는 경우에도 발생할 수 있습니다. 정적 멤버를 사용하려면 컴파일러가 C++ 예외 처리를 의미하는 동적 /clr:pure초기화를 사용해야 합니다. 그러나 C++ 예외 처리는 __try 블록에서 허용되지 않습니다.

/clr:pure/clr:safe 컴파일러 옵션은 Visual Studio 2015에서 더 이상 사용되지 않으며 Visual Studio 2017에서는 지원되지 않습니다.

예시

다음 샘플에서는 C2712 오류가 발생하는 경우 및 이를 해결하는 방법을 보여 줍니다.

// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
   static int smf();
   void fnc();
};

void S1::fnc() {
   __try {
      static int (*array_1[])() = {smf,};   // C2712

      // OK
      static int (*array_2[2])();
      array_2[0] = smf;
    }
    __except(0) {}
}