Повреждение при передаче ссылочного аргумента в dll

Сначала я использую OpenCV 2.4.2 с Visual 2008 на WinXp. Вот проблема:

Я использую imwrite функция для записи серого выровненного изображения, которое имеет следующий прототип:

bool imwrite( const string& filename, InputArray img, const vector<int>& params=vector<int>());

Тип изображения предварительно проверен и установлен (8 бит, 1 канал).
Тем не менее, у меня есть исключение только в режиме Release (ошибка -2, не удалось найти устройство записи для указанного расширения) для записи образа bmp, в моем случае .\Images\Debug\calibration_ref.bmp,
Я не понял, что не так с этим именем файла.

Подсказка

Посмотрев глубоко в исходный файл dll (opencv_highgui242d.dll ,loadave.cpp, l.298), я понял, что параметр const std::string & filename (по крайней мере, этот …) был поврежден (или освобожден?) из-за <Bad Ptr>, Чтобы получить такой результат, я использовал dll-версию отладочной версии highgui в режиме Release, иначе, при выпуске версии highgui, вместо этого я получаю строку мусора. Я подозреваю, что все аргументы были искажены.

Clue2

Я абсолютно не знаю, откуда взялась эта коррупция! Я искал здесь и там, но все, что я мог найти, связано с отключением оптимизации в режиме релиза, затем исправлением ошибок и Эта статья на строковом классе о потоке безопасно, но я не уверен, что это проблема.

Я бы добавил, что используемая мной версия OpenCV не является пакетом. Я построил это особенно с TBB (версия 4.0 6005). Не стесняйтесь задавать больше вопросов.

0

Решение

Вы просматриваете сборку релиза, поэтому отладчик не сможет отобразить все значения, поскольку оптимизация удалит некоторые объекты. Я думаю, что вы спустились в кроличью нору с «коррупцией».

Вы говорите, что ошибка error -2, could not find a writer for the specified extension так вы смотрели, чтобы узнать, почему это? Какой модуль записи используется в режиме отладки, а почему нет — в режиме выпуска. Это может быть просто отсутствующая DLL в вашем рабочем каталоге.

Я также рекомендую изменить имя выходного файла, чтобы не путать вывод с каждой сборки. .\Images\Debug\calibration_ref.bmp может быть лучше, как .\Images\Release\calibration_ref.bmp, например.

0

Другие решения

Проблема связана со статическим порядком инициализации.

Поскольку имя файла объявлено как статическое, что зависит от других статических параметров (у меня много статических переменных в этом проекте), я получил неинициализированную переменную в качестве параметра. Это причина, почему он поднял исключение с плохим аргументом.

Я мог отследить это явление благодаря точкам останова при инициализации переменной и выполнении функции. Казнь произошла первой …
Тем не менее, было бы неплохо сделать трассировку параметра (скорее OutputDebugString или что-то для принудительного отображения, так как трассировка не будет работать в режиме разблокировки) до входа в функцию.

0