Вчера я столкнулся с довольно неприятным сбоем при использовании библиотек DLL, скомпилированных с GCC под Cygwin. По сути, как только вы запускаете отладчик, вы можете оказаться в ловушке отладки, вызванной тем, что RtlFreeHeap () получает адрес для чего-то, что он не выделил.
Это известная ошибка с GCC 3.4 на Cygwin. Ситуация возникает из-за того, что библиотека libstdc ++ включает «умную» оптимизацию для пустых строк. Я избавляю вас от деталей (см. Ссылки в этом посте), но всякий раз, когда вы выделяете память в одной DLL для объекта std :: string, который «принадлежит» другой DLL, вы в конечном итоге выделяете одну кучу для освобождения, полученную из еще одна куча. Следовательно, SIGTRAP в RtlFreeHeap () .
Существуют и другие проблемы, возникающие при выдаче исключений через границы DLL.
Это делает GCC 3.4 в Windows неприемлемым решением, как только ваш проект основан на DLL и STL. У меня есть несколько вариантов, чтобы пройти мимо этого параметра, многие из которых очень трудоемки и / или раздражают:
Я не могу (пока) переключиться на другой компилятор из-за некоторых других инструментов, которые я использую. Комментарии, которые я нахожу от некоторых людей из GCC, гласят, что «об этом почти никогда не сообщают, поэтому, вероятно, это не проблема», что раздражает меня еще больше.
У кого-нибудь есть новости по этому поводу? Я не могу найти четкого объявления о том, что это исправлено (ошибка по-прежнему помечена как "назначенная"), кроме одного комментария к Радио трекер ошибок GNU .
Спасибо!