Убедитесь, что все библиотеки, на которые вы ссылаетесь, скомпилированы в той же версии CLR, что и приложение, в котором вы работаете, — все в выпуске или все в отладке.
Когда вы компилируете в Debug и Release, вы на самом деле ориентируетесь на две разные версии библиотеки времени выполнения C. Эти версии совершенно разные, они используют разные стратегии выделения памяти и используют разные кучи. Но самое главное, что нужно знать, это то, что они НЕ совместимы друг с другом.
Библиотека времени выполнения версии C выделяет память, как и ожидалось, в то время как отладка добавит дополнительную информацию, такую как защитные блоки для отслеживания переполнения буфера и местоположение, вызывающее функцию выделения, и, в свою очередь, она выделяет больше памяти, чем версия.
Если вы связываете свое приложение со смесью библиотек DLL, которые были созданы в Release и Debug, вы, скорее всего, в конечном итоге попытаетесь удалить объект в одной CLR, который был создан в другой. Это означает, что вы будете пытаться освободить больше или меньше памяти, чем было выделено для объекта, и это может привести к повреждению кучи.
Вы должны создать свое приложение, а также подключиться к библиотекам, которые созданы в той же конфигурации, либо Release, либо Debug.
Эта проблема может возникнуть, особенно в модулях, которые компилируются разными компиляторами.
Есть обходной путь, который я упомяну, но не рекомендую. Если по какой-то причине вам все еще нужно собирать в разных режимах, этот обходной путь позволит выделить и освободить всю память из одной и той же общей кучи. API GetProcessHeap позволит вам получить доступ к общей куче через различные модули. Используя HeapAlloc и HeapFree, вы можете выделять и освобождать память в общей куче. Примечание. HeapAlloc и HeapFree должны заменить все вызовы malloc и free в вашем приложении.
person
Merav Kochavi
schedule
17.01.2017