在一个进程中混合和匹配Visual C ++运行时DLL文件有多糟糕?

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

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

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

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

有关混合CRT版本导致的堆损坏的更多信息,请访问: http : //siomsystems.com/mixing-visual-studio-versions/