如何处理由于项目中涉及的库的不同构建标志而出现的当前堆错误(在调试模式下)

How to cope with the error of currupted heap(in debug mode) which arise due to different build flags of libraries involved in a project

本文关键字:模式 错误 标志 调试 项目 于项目 理由 何处 同构 构建      更新时间:2023-10-16

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

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

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

问题:

  • 有可能找出第三方图书馆是什么吗建造,如果是,我该怎么做
  • 我该怎么给你分类不同的构建标志
  • 我猜这个错误是由于不同的构建标志是否正确

有可能找出用什么旗帜建立的第三方图书馆吗?如果有,我该怎么做这个

是的。使用Visual Studio 2005和2008版本构建的C或C++DLL需要一个清单,说明它们需要的C运行时DLL的版本。您可以使用VS、文件+打开+文件来查看它,选择DLL并打开标记为"RT_MANIFEST"的节点。资源ID 2是说明CRT的类型和版本的清单。它应该和你的相匹配。将其导出以便于阅读。如果它丢失了,那么它要么不是用/MD构建的,要么使用了完全不同版本的VS,这本身就是个坏消息。

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

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

我认为错误是由于不同的构建标志造成的,这是正确的吗?

这是可能的,但可能性不大。不匹配不会自动导致崩溃,程序员当然可以设计DLL接口,这样就不会成为问题。您通常可以从函数签名和文档中判断。问题是DLL分配了一个对象,而你应该释放它。当函数返回一个指针时,这将是显而易见的。或者像std::string这样的标准C++类库对象。不太明显的是当它抛出异常时。这样的问题也是高度可重复的,它会持续爆炸,而不是偶尔爆炸。

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