Boost вызывает недопустимый блок при перегрузке операторов new / delete - PullRequest
1 голос
/ 28 декабря 2010

У меня проблема, которая, по-видимому, является недопустимым блоком памяти, который происходит во время вызова Boost для Boost:runtime:cla::parser::~parser.Когда это глобальное удаление вызывается для этого объекта, C ++ утверждает в блоке памяти как недействительный:

dbgdel.cpp(52):

/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

Исследование, которое я провел, выявило, что проблема произошла из-за глобальной перегрузки операторов new / delete.Эти перегрузки помещены в отдельную DLL.Я обнаружил, что проблема возникает только тогда, когда эта DLL компилируется в RELEASE, в то время как основное приложение компилируется в DEBUG.

Поэтому я подумал, что варианты сборки Release / Debug могли создать такую ​​проблему в Boost / CRTпри перегрузке новых / удаленных операторов.Поэтому я попытался явно вызвать _malloc_dbg и _free_dbg без перегрузки функций даже в режиме выпуска, но это не решило проблему с недопустимым блоком кучи.

Есть идеи, что является основной причиной проблемы?разрешима ли эта ситуация?

Я должен подчеркнуть, что проблема началась только тогда, когда я начал использовать Boost.До этого ЭЛТ никогда не жаловался на недопустимый блок памяти.Так может ли это быть внутренняя ошибка Boost?

Спасибо!

1 Ответ

2 голосов
/ 28 декабря 2010

Я обнаружил, что проблема возникает только тогда, когда эта DLL компилируется в RELEASE, в то время как основное приложение компилируется в DEBUG

Как правило, вы не можете смешивать модули, которые используют CRT выпуска сотладка CRT, если выделение памяти из одного типа времени выполнения освобождается другим временем выполнения (могут быть и другие проблемы, но проблемы выделения памяти, похоже, возникают чаще всего).

Решение состоит в том, чтобы использовать встроенные модулипротив среды выполнения отладки друг с другом и модулей, которые построены против среды выполнения выпуска друг с другом - не смешивайте их.

Объяснение Microsoft можно найти здесь: http://msdn.microsoft.com/en-us/library/ms235460.aspx

, поскольку каждая копия библиотеки CRT имеет свой собственный менеджер кучи, выделение памяти в одной библиотеке CRT и передача указателя через границу DLL для освобождения другой копией библиотеки CRT является потенциальной причиной повреждения кучи.

...