在一个小项目中,我使用了几个 boost 包(asio、property_tree、文件系统等),我不得不注意到,一切正常,直到在 boost 包中的某个地方抛出异常。它发生在所有这些包中,但我现在能够将其归结为以下最小程序:
#include <iostream>
#include "boost/throw_exception.hpp"
int main(int argc, char* argv[])
{
boost::throw_exception(std::exception("foo")); // <-- this will produce the problem
throw std::exception("foo"); // <-- this works as expected
return 0;
}
异常抛出正常,但是当程序终止时我得到
Run-Time Check Failure #0 - The value of ESP was not properly
saved across a function call ...
我尝试对此进行调试(我在 Visual Studio 2010 Express 中使用 boost 1.49.0,crt 静态链接)但是当所有可见代码都已执行时出现问题。我可以看到 std:exception 析构函数没有通过,但在那之后(“在”我的程序的 return 语句中)消息框被触发。
编辑:一些附加信息:
- 在上面的最小程序中,boost 仅用于 headers
- 不涉及其他库文件
- 程序只加载ntdll.dll和kernel32.dll
- 没有创建额外的线程
- 当我动态链接到 CRT 时,问题也出现了
EDIT2:再次更多信息:
- 在上面的程序中添加了包含
- 问题也出现了,当我抛出 runtime_error 时
- 当我用 (...) 或 (std::exception) 捕获异常时,问题就消失了
- 当我重新抛出异常时,问题甚至仍然得到解决