【问题标题】:How bad is it to mix and match Visual C++ runtime DLL files in one process?在一个进程中混合和匹配 Visual C++ 运行时 DLL 文件有多糟糕?
【发布时间】:2013-11-25 12:16:52
【问题描述】:

我有一个使用 Visual Studio 2012 构建的应用程序,因此它依赖于 MSVCP110.DLLMSVCR110.DLL。我正在使用另一个 DLL 文件,它似乎是使用 Visual Studio 2010 构建的,并且依赖于 MSVCP100.DLLMSVCR100.DLL。我使用 Visual Studio 2008 构建的另一个 DLL 依赖于 MSVCR90.DLL

这是一件坏事吗?真的很糟糕吗?我应该担心吗?我问的原因是运行时堆分配器抱怨堆损坏。这可能与混合运行时版本有关吗?

【问题讨论】:

  • 是的。尝试在您的应用程序中一次使用多个 Visual Studio 运行时是一件非常糟糕的事情。主要原因是每个 CRT 都有自己独立的堆(堆之间没有通信)。这意味着您不能在 1 个堆中分配内存并在一秒钟内释放它。这将导致堆损坏并导致随机崩溃,因为损坏可能不会导致下一次分配或释放时崩溃。
  • BTW Visual Studio 2010 运行时文件名中将包含 100。
  • @drescherjm - 修复了文件名。复制粘贴错误。

标签: c++ c winapi visual-c++ dll


【解决方案1】:

混合和匹配来自不同编译器版本的 Visual Studio 运行时并不安全,主要是因为每个运行时都会创建自己的独立堆。由于堆将完全独立,因此您不能使用 1 个堆分配内存并将其释放到不同的堆中。这样做会破坏你的堆。损坏通常不会导致立即崩溃,因为在接下来的几次分配或释放时可能无法访问堆的损坏部分,因此很难调试。

对于单个 dll 的堆与应用程序不同的情况,可以以非常有限的方式解决该问题。您必须隔离 dll,以便 dll 的所有分配和解除分配仅发生在 dll 内部。而且隔离也必须走另一条路。如果没有隔离,dll 将无法安全地从应用程序中释放内存。

关于混合 CRT 版本导致的堆损坏的更多信息可以在这里找到: http://siomsystems.com/mixing-visual-studio-versions/

编辑(2020 年 4 月 1 日): 上面的答案早于 Visual Studio 2015。Visual Studio 2015 到 2019 彼此二进制兼容,但与任何以前的版本都不兼容。

以下链接讨论了这些版本之间的二进制兼容性:https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2019

【讨论】:

  • 这或多或少是我的想法。很难隔离这些不同模块之间的分配,因此我将不得不努力使用 vs2012 重建它们。谢谢!
猜你喜欢
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
相关资源
最近更新 更多