Сбой после выделения памяти 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 отключаются.

Другие вопросы по тегам