C++ 如何处理由于项目中涉及的库的不同构建标志而产生的currupted heap错误(在调试模式下)

C++ 如何处理由于项目中涉及的库的不同构建标志而产生的currupted heap错误(在调试模式下),c++,debugging,dll,build,heap-corruption,C++,Debugging,Dll,Build,Heap Corruption,简介: 我正在重构win32应用程序,我使用VS2008。 该应用程序由我自己的dll和第三方dll组成 问题: 当我在调试模式下运行应用程序并执行某些操作时,会出现错误:应用程序程序触发了断点,堆已损坏 采取的行动: 我搜索了internet,发现此错误可能是因为项目中的dll使用了不同的生成标志(多线程调试/MD和多线程调试dll/MDd)(这导致它们使用不同的c运行时库,对于每个库,都会维护自己的内存工作列表,因此这可能会导致堆损坏)。 我已经检查了我的dll——它们都有相同的标志:调试多

简介:
我正在重构win32应用程序,我使用VS2008。 该应用程序由我自己的dll和第三方dll组成

问题:
当我在调试模式下运行应用程序并执行某些操作时,会出现错误:应用程序程序触发了断点,堆已损坏

采取的行动:
我搜索了internet,发现此错误可能是因为项目中的dll使用了不同的生成标志(多线程调试
/MD
和多线程调试dll
/MDd
)(这导致它们使用不同的c运行时库,对于每个库,都会维护自己的内存工作列表,因此这可能会导致堆损坏)。 我已经检查了我的dll——它们都有相同的标志:调试多线程dll。因此我认为第三方dll中的一个可能是使用多线程调试标志构建的

问题:

  • 有没有可能找出第三方图书馆是什么 建成,如果是这样,我如何才能做到这一点
  • 我怎样才能把我的问题告诉你 不同的构建标志
  • 我猜这个错误是由于 不同的构建标志是否正确
有没有可能知道第三方图书馆是用什么旗帜建造的,如果有,我该怎么做

<>是的。用VisualStudio版本2005和2008构建的C或C++ DLL需要一个清单,该清单声明了他们需要的C运行时DLL的版本。您可以用VS、Field+Open+文件查看它,选择DLL并打开标记为“RTIMANIFY”的节点。.Resource ID 2是声明CRT的类型和版本的清单。它应该与您的相匹配。导出它以使其更易于阅读。如果缺少,则它不是使用/MD构建的,或者使用了完全不同的VS版本,这本身就是个坏消息

我如何对我的不同构建标志进行排序

您不能。您需要联系第三方并请求与您的版本兼容的版本

我猜错误是由于不同的构建标志导致的,对吗

这是可能的,但可能性不大。不匹配不会自动导致崩溃,程序员当然可以设计DLL接口,这样就永远不会出现问题。通常可以从函数签名和文档中看出。问题是DLL分配了一个对象,而您应该释放它。它会函数返回指针时,明显的是一个标准的C++类类库对象,如STD::String。抛出异常时,它不太明显。这样的问题也是高度可重复的,它会一致地炸弹,而不是偶尔。


你犯的最大错误是在这里问这个问题。你应该和第三方雇佣的程序员谈谈,他已经在这个DLL上工作过了。他会知道你问题的确切答案,并且可以很容易地解决你的问题。如果你不能得到这种支持,那么你应该不要使用这些DLL,t嘿,这会让你的生活在很长一段时间内痛苦不堪。

当你运行发布版本时,你会遇到这个问题吗?我认为这可能不是标志问题。如果是标志,你的程序将根本无法编译。不仅仅是/M选项的不同选择,那些DLL可能使用的是完全不同的CRT版本。你需要重新编译使用相同的设置和相同的编译器对它们进行测试。@Captain Obvlious我还没有尝试运行发布版本,这是一个非常大的项目,创建发布版本将非常耗时,因此这是我将要做的最后一个选项try@HansPassant如果我只有第三方库的二进制文件,如何重建该库(我没有源代码)