Сбой после выделения памяти C ++ в отладочной DLL - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть класс, находящийся внутри 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 ]

0 голосов
/ 07 декабря 2011

Я обнаружил, что проблема была в 2 открытых переменных-членах, которые отсутствовали в заголовочном файле класса по моей ошибке.Когда я их добавил, проблема была решена.

0 голосов
/ 02 декабря 2011

Пожалуйста, проверьте эти макросы отладки, это важно.Что-то вроде ASSERT ...

Они компилируются в режиме отладки.

Когда вы компилируете код в режиме выпуска, MACRO отладки отключаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...