【发布时间】:2009-10-06 22:07:18
【问题描述】:
我遇到了在 Visual Studio 2005 中打开浮点异常的问题。如果我有这样的代码:
double d = 0.0;
double d2 = 3.0;
double d3 = d2/d;
如果我注册了一个 SEH 处理程序例程,那么我可以轻松地将 div-by-zero 转换为 C++ 异常并捕获它。到目前为止一切顺利。
但是,当我这样做时,第一个操作数(上例中的 0.0)留在 FPU 寄存器堆栈中。如果我这样做八次,那么从那时起,我将开始在每个浮点操作中都出现浮点堆栈检查异常。
我可以使用 __asm 块执行 FSTP 来处理这个问题,从而将杂散值从堆栈中弹出,一切都很好。
但是,这让我很担心,因为我没有在任何地方看到过这个讨论。我如何确定应该弹出的值的数量?在异常发生时弹出堆栈上的所有内容是否安全?在这方面是否有任何推荐的最佳实践?
谢谢!
【问题讨论】:
-
SEH 也会发生这种情况吗?如果您不注册 SEH 处理程序,行为是否相同?
-
发生这种情况是因为执行了 _controlfp() 调用,该调用取消了我感兴趣的异常(例如 div-by-zero)。我认为是否注册了 SEH 处理程序并不重要 - 但如果没有,我只会因未处理的异常而崩溃。
标签: c++ floating-point exception visual-c++