Насколько плохо смешивать и сопоставлять DLL файлы Visual С++ во время выполнения одного процесса?

У меня есть приложение, которое построено с помощью Visual Studio 2012, и, следовательно, оно зависит от MSVCP110.DLL и MSVCR110.DLL. Я использую другой DLL файл, который, кажется, был создан с помощью Visual Studio 2010 и зависит от MSVCP100.DLL и MSVCR100.DLL. Еще одна DLL, которую я создал, была построена с помощью Visual Studio 2008 и зависит от MSVCR90.DLL.

Это плохо? Очень плохо? Я должен беспокоиться? Причина, по которой я спрашиваю, заключается в том, что диспетчер кучи времени выполнения жалуется на повреждение кучи. Может ли это быть связано со смешанными версиями времени выполнения?

Ответ 1

Небезопасно смешивать и сопоставлять время исполнения Visual Studio из разных версий компилятора главным образом потому, что каждая среда выполнения создаст свою собственную независимую кучу. Поскольку кучи будут полностью независимыми, вы не можете выделить память с помощью 1 кучи и освободить ее в другой куче. Это может испортить ваши кучи. Коррупция обычно не вызывает немедленного сбоя, так как поврежденная часть кучи не может быть доступна при следующих нескольких распределениях или освобождениях, поэтому ее очень сложно отладить.

В случае единственной dll, имеющей разную кучу, чем приложение, можно обойти проблему очень ограниченным образом. Вы должны были бы изолировать dll так, чтобы все распределения и освобождения dll происходили только внутри dll. А также изоляция должна была пойти и наоборот. Dll не сможет безопасно освободить память из приложения без изоляции.

Более подробную информацию о кучевом повреждении, вызванном смешиванием версий CRT, можно найти здесь: http://siomsystems.com/mixing-visual-studio-versions/