исключение в режиме выпуска, а не в режиме отладки

Когда я запускаю этот код в режиме отладки, никаких исключений не возникает, но в режиме выпуска я получаю следующее исключение:

Необработанное исключение в 0x768b4b32 в RealTimeSLT.exe: исключение Microsoft C ++: cv :: Exception в ячейке памяти 0x003de734 ..

почему эта проблема появляется только при выпуске? и как ее исправить ??

FileStorage fs2(fileName, FileStorage::READ);
fs2.open(fileName, FileStorage::READ);
fs2["Mat"] >> Mat;  
fs2["dMat"]>> dMat; 
fs2.release();

person RBM    schedule 20.05.2013    source источник
comment
Класс OpenCV cv :: FileStorage выдает исключение, когда не может открыть файл. Было бы разумно перехватить это исключение и попросить пользователя выбрать другой файл. Или используйте правильный путь к файлу в своем коде.   -  person Hans Passant    schedule 20.05.2013
comment
Вам не нужно вызывать open() как строку, которая уже вызывалась с указанными параметрами. По сути, вы открываете, закрываете и снова открываете файл прямо сейчас.   -  person Niko    schedule 20.05.2013
comment
Если путь не является явным, но относительно рабочего каталога, он не найдет его, когда вы запустите исполняемый файл в другом каталоге. Иногда Debug и Release используют разные рабочие каталоги. Проверьте конфигурацию проекта.   -  person Peter Wood    schedule 20.05.2013
comment
В отладочных сборках VS неинициализированные голые указатели обычно инициализируются нулевым значением от вашего имени. Если в вашем коде есть голые указатели, которые вы забыли инициализировать нулевым значением, они будут указывать на местоположения мусора в сборках выпуска, и разыменование одного из них будет неопределенным поведением.   -  person Oktalist    schedule 20.05.2013


Ответы (4)


Предполагая, что вы работаете в VS, выберите «Отладка-> Исключения» и нажмите «Прервать при возникновении исключения».

Запустите приложение в отладчике и посмотрите, почему возникает это исключение и на что оно жалуется - скорее всего, это что-то другое в среде, в которой работает приложение.

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

Другой вариант - перехватить возникшее исключение и затем записать его внутреннее сообщение - обычно это функция под названием «what ()» или аналогичная. Это, скорее всего, укажет вам на настоящую проблему. Вполне вероятно, что вы все равно захотите поймать это исключение.

Если его неопределенное поведение вызывает разницу между Release и Debug, то, вероятно, вышеупомянутое не будет так широко использоваться.

person Mike Vine    schedule 20.05.2013

Код выглядит странно.

Не зная больше о вашем объекте FileStorage, я вижу, что вы создали его в стеке в первой строке.

Предполагая, что release () - это какой-то метод подсчета ссылок, fs2.release () попытается удалить его, поскольку счетчик ссылок будет равен нулю.

Не рекомендуется удалять объекты, которые были размещены в стеке. Вы получите крах.

Либо (1), попробуйте это вместо этого (т. Е. Выделить в куче)

FileStorage fs2 = new FileStorage(fileName, FileStorage::READ);

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

Или 2: удалите последнюю строку, поскольку fs2 выйдет из области видимости по мере раскручивания стека.

person Bathsheba    schedule 20.05.2013
comment
Хотя в общих случаях это может быть хорошим советом, в данном конкретном случае вы ошибаетесь: FileStorage::release() OpenCV не удаляет объект, а закрывает файл и освобождает внутренний буфер. Совершенно нормально вызвать его после завершения чтения из файла, см. docs.opencv .org / modules / core / doc / xml_yaml_persistence.html - person Niko; 20.05.2013
comment
Странно, что поведение отладки и выпуска так сильно отличается. Вот почему я построил не то дерево, думая о кучах отладки и выпуска. - person Bathsheba; 20.05.2013

Вам нужно снова добавить файлы "* .lib" в компоновщик проекта vs, когда U r находится в режиме выпуска. Я думаю, что это ошибка opencv после версии 2.4.1.

person user4069814    schedule 23.09.2014

В моем случае это произошло потому, что библиотеки OpenCV были созданы с помощью VS2010, а я использовал VS2015.

Чтобы решить эту проблему, я изменил свой Project Properties> General> Platform Toolset в соответствии с набором инструментов, который использовался для создания библиотек opencv, с которыми я связывал.

person Mark Klink    schedule 08.06.2017