Режим выпуска работает нормально, но режим отладки дает мне это:
Необработанное исключение в 0x0fc5edac (msvcr90d.dll) в Executable_to_LinkDLL_to_FDDDLL.exe: 0xC0000005: Место записи нарушения прав доступа 0xbaadf00d.
Я использую библиотеки выпуска Octave. Исключение показано ниже. Мне было интересно, сталкивался ли кто-нибудь с этой проблемой.
Вот где ошибка происходит в моем коде (на основе следующего стека вызовов):
Глядя на документацию Octave для string_vector
ссылки на std::string
используются. Это означает, что библиотека Octave должна быть собрана для компилятора и настроек, в которых вы разрабатываете.
Причина в том, что такие классы, как std::string
не должен быть двоично совместимым с другой версией std::string
, Когда вы использовали сборку релиза в отладочной версии, внутренние компоненты std::string
отличаются в версии выпуска и отладки.
Тем не менее, даже если версии std::string
будет бинарно-совместимым, у вас есть проблема, чтобы убедиться, что Octave DLL и ваше приложение используют одну и ту же кучу времени выполнения. Причина в том, что std::string
использует динамически распределенную память и должна использовать одну и ту же кучу как для DLL, так и для приложения. Для этого необходимо использовать версию DLL библиотеки времени выполнения Visual Studio (/MD
или же /MDd
флаги компилятора должны быть установлены для выпуска или отладочной версии среды выполнения DLL, соответственно).
Итак, у вас есть две проблемы:
Бинарная совместимость между версиями std::string
между Octave DLL и вашим приложением, и
Убедитесь, что DLL и приложение построены так, чтобы использовать версию DLL библиотеки времени выполнения, чтобы гарантировать, что используется одна и та же куча памяти.
Ваше решение использования char *
только избегает std::string
ссылки и объекты от передачи. Я не знаю, насколько надежно это решение, так как кажется, что было бы очень легко ошибиться и вызвать std::string
функционировать в какой-то момент.
Я просто хотел бы убедиться, что правильные библиотеки DLL используются при разработке и развертывании вашего приложения. Это именно то, что Microsoft делает со своими DLL — вы не можете смешивать и сопоставлять версии и отладки версий Microsoft DLL в вашем приложении, поэтому то же самое применимо и здесь. Единственный раз, когда вы можете смешивать / сопоставлять релиз и отладку DLL, это если DLL использует только «простые» типы, такие как DWORD, LONG, TSTR и т. Д., Или указатели на эти типы для параметров и возвращаемых значений.
Отладчик выполняет запись в неинициализированную память, которая тихо используется вашей программой в режиме Release. (То есть в режиме Release это катастрофа в ожидании). 0xbaadf00d
на самом деле это своего рода сообщение отладчика; смотрите соответствующую запись Вот.
Не видя ваш код, трудно сказать, что это за проблема.
Изменить: Вы разместили отладочную выходную ссылку memcpy
— так что случаи memcpy
в вашем коде есть одно место, чтобы выглядеть очевидно.
Windows LocalAlloc помечает неинициализированную память кучи значением 0xbaadf00d.
Похоже, вы берете значение указателя из неинициализированного источника и пытаетесь записать в эту область памяти. Хотя это может «работать» в режиме выпуска, это может привести к повреждению памяти в программе, которая выполняется в течение более длительного периода времени.
Я решил эту проблему, реализовав следующий фрагмент кода. Вместо того, чтобы использовать string_vector
класс Octave, теперь я использую массив char*
лайк char*argv[2]={"embedded","-q"};
следовательно, ошибка была устранена, но я столкнулся с другой ошибкой, упомянутой в этой ссылке: Octave C ++ и VS2010