1

在一个小项目中,我使用了几个 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) 捕获异常时,问题就消失了
  • 当我重新抛出异常时,问题甚至仍然得到解决
4

1 回答 1

0

您可以尝试使用动态运行时,以便 Boost 和您的程序都使用相同的运行时吗?如果您静态链接到运行时,那么您可能会将两个运行时加载到进程中,这可能会导致问题。上次我看到这个问题时,它是由程序和 DLL 之间的不同调用约定引起的(例如 cdecl/fastcall/pascal)。只是使用静态运行时不应该有所作为。

顺便说一句:您可以进行一个简单的测试来找出错误所在。如果您将来自 Boost 的相应代码包含到您的程序中,您将有效地获得就地编译、静态链接的 Boost。如果可行,那么您可以合理地确定问题出在您构建或链接事物的方式上。

于 2013-07-12T05:15:20.313 回答