컴파일러 오류 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) {}
}