Проблемы с malloc и new возникают при использовании DLL.В зависимости от параметров сборки, DLL может иметь свою собственную копию CRT.Это заставляет его использовать собственную кучу для выделения памяти из кучи , отличной от , чем та, которая используется в EXE.Это вызывает сбой, когда память выделяется одним модулем и освобождается другим.Очень часто, когда вы используете STL.
Один из способов решить эту проблему - скомпилировать код с параметром / MD.Это заставляет использовать общую копию CRT, хранящуюся в его собственной DLL.Проблема решена, теперь есть только один распределитель, использующий одну кучу.
Эта проблема также возникает с COM, он позволяет взаимодействовать различным языкам.Конечно, они никогда не будут использовать общий распределитель, так как эти языки имеют разные библиотеки поддержки времени выполнения.По контракту код COM должен использовать один распределитель, предоставляемый поддержкой времени выполнения COM, CoTaskMemAlloc ().
Обратите внимание, что HeapAlloc () не может решить эту проблему.Требуется дескриптор кучи, возвращаемый HeapCreate ().Разные модули должны будут совместно использовать этот дескриптор, чтобы избежать проблем.
Обновление: для адреса в VS2012 CRT теперь выделяет из общей кучи, кучи процесса по умолчанию (функция GetProcessHeap).