컴파일러 경고(수준 1) C4530
C++ 예외 처리기가 사용되었지만 해제 의미 체계가 활성화되지 않았습니다. /EHsc를 지정하세요.
이 코드는 C++ 예외 처리를 사용하지만 /EHsc 는 컴파일러 옵션에 포함되지 않았습니다.
설명
컴파일러에는 /EHsc
예외 처리를 위해 C++ 표준을 따르는 C++ 코드를 빌드하는 옵션이 필요합니다. 표준 C++ 해제 의미 체계 는 예외가 throw된 위치와 catch된 위치와 해당 리소스가 복구되는 위치 간에 생성된 개체 및 스택 프레임을 지정합니다. 이 프로세스를 스택 해제라고 합니다.
이 /EHsc
옵션은 예외가 포함된 스택 프레임을 통과할 때 자동 스토리지 개체에서 소멸자를 호출하는 코드를 생성하도록 컴파일러에 지시합니다. 자동 스토리지 개체는 로컬 변수와 같이 스택에 할당된 개체입니다. 함수가 호출될 때 자동으로 할당되고 반환될 때 자동으로 해제되기 때문에 자동 스토리지라고 합니다. 스택 프레임은 자동 스토리지와 함께 함수가 호출되면 스택에 배치되는 데이터입니다.
예외가 throw되면 catch되기 전에 여러 스택 프레임을 통과할 수 있습니다. 이러한 스택 프레임은 예외가 역방향 호출 순서로 통과하기 때문에 해제되어야 합니다. 리소스를 완전히 복구하려면 각 스택 프레임의 자동 스토리지 개체를 제거해야 합니다. 함수가 정상적으로 반환되면 자동으로 발생하는 것과 동일한 소멸 및 복구 프로세스입니다.
/EHsc
옵션을 사용하도록 설정하지 않으면 throw 함수와 예외가 catch된 함수 사이의 스택 프레임에 있는 자동 스토리지 개체가 제거되지 않습니다. 또는 catch
블록에서 try
만든 자동 스토리지 개체만 제거되어 상당한 리소스 누수 및 기타 예기치 않은 동작이 발생할 수 있습니다.
실행 파일에서 예외를 throw할 수 없는 경우 이 경고를 무시해도 됩니다. 일부 코드에는 다른 예외 처리 옵션이 필요할 수 있습니다. 자세한 내용은 /EH를 참조하세요.
예시
다음 샘플에서는 C4530을 생성합니다.
// C4530.cpp
// compile with: /W1
int main() {
try{} catch(int*) {} // C4530
}
/EHsc
샘플을 컴파일하여 경고를 해결합니다.