21

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

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

4

1 回答 1

19

混合和匹配来自不同编译器版本的 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

于 2013-11-13T03:52:39.710 回答