编译器警告(等级 1)C4530
使用了 C++ 异常处理程序,但未启用展开语义。 请指定 /EHsc
该代码使用 C++ 异常处理,但 /EHsc 未包含在编译器选项中。
备注
编译器需要 /EHsc
选项来生成遵循 C++ 异常处理标准的 C++ 代码。 标准 C++ 展开语义指定必须销毁在异常引发位置和异常捕获位置之间构造的对象和堆栈帧并恢复其资源。 此过程称为展开堆栈。
/EHsc
选项使编译器在异常通过包含的堆栈帧时生成代码来调用自动存储对象的析构函数。 自动存储对象是栈上分配的对象,例如局部变量。 之所以称为自动存储,是因为它在调用函数时自动分配,并在函数返回时自动发布。 堆栈帧是调用函数时放置在堆栈上的数据及其自动存储。
异常在引发时可能已遍历了多个堆栈帧才被捕获。 异常以相反的调用顺序通过这些堆栈帧时,这些堆栈帧必须展开。 必须销毁每个堆栈帧中的自动存储对象才能完全地恢复其资源。 这与函数正常返回时自动发生的销毁和恢复过程相同。
如果未启用 /EHsc
选项,则不会销毁引发的函数和捕获异常的函数之间的堆栈帧中的自动存储对象。 只销毁 try
或 catch
块中创建的自动存储对象,这可能会导致严重的资源泄漏和其他意外行为。
如果在可执行文件中不可能引发异常,可以放心地忽略此警告。 某些代码可能需要其他异常处理选项。 有关详细信息,请参阅 /EH。
示例
下面的示例生成 C4530:
// C4530.cpp
// compile with: /W1
int main() {
try{} catch(int*) {} // C4530
}
使用 /EHsc
编译示例以解决警告。