Сбой после выделения памяти C++ в отладочной DLL
У меня есть класс, проживающий внутри DLL и exe, использующий эту DLL. Exe просто создает класс в dll и вызывает его методы. Все отлично работает при компиляции в режиме релиза. Но если я скомпилирую все (включая библиотеку OpenCV, которую использует мой класс) в режиме отладки с флагом MDd, тогда я получу:
Debug Assertion Failed! _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Все задействованные двоичные файлы используют одну и ту же версию библиотек времени выполнения, и все они скомпилированы на одном компьютере с VS 2008. Насколько я понимаю (основываясь на моих отладках), проблема заключается в следующем:
Я создаю экземпляр моего класса с помощью оператора "new" в exe (под main), а затем, как только конструктор моего класса делает что-то, требующее выделения памяти, место в памяти самого класса перезаписывается, как если бы оба dll и exe используют одно и то же пространство памяти, но разные "следующие доступные позиции для выделения" смещений. Поэтому dll не видит, что внутри exe-файла уже было выполнено выделение, следовательно, перезаписывается область памяти, в которой находится мой класс. Очевидно, это вызывает проблемы с памятью.
Есть идеи, почему это может произойти? Я изо всех сил старался объяснить ситуацию, но, конечно, могу предоставить больше информации, если потребуется.
Заранее спасибо.
2 ответа
Я обнаружил, что проблема была в 2 открытых переменных-членах, которые по моей ошибке отсутствовали в заголовочном файле класса. Когда я их добавил, проблема решена.
Пожалуйста, проверьте эти макросы отладки, это важно. Что-то вроде ASSERT...
Они компилируются в режиме отладки.
Когда вы компилируете код в режиме выпуска, отладочные MACRO отключаются.