当我在调试模式下运行此代码时,没有出现异常,但在发布模式下,我得到这个异常:
RealTimeSLT.exe: microsoftc++中0x768b4b32的未处理异常exception: cv:: exception at memory location 0x003de734.
为什么这个问题只在发布时出现?我该如何修复它?
FileStorage fs2(fileName, FileStorage::READ);
fs2.open(fileName, FileStorage::READ);
fs2["Mat"] >> Mat;
fs2["dMat"]>> dMat;
fs2.release();
假设你在VS中运行,选择Debug->Exceptions并点击'Break When Exception is Thrown'
在调试器下运行应用程序,看看为什么会抛出异常,它抱怨什么——很可能是应用程序运行的环境不同。
如果您需要检查变量,那么release build会使这变得困难,因为优化器可能会混淆调试器。您可以通过在发布版本中关闭优化来解决这个问题。但是,如果是时间问题,这可能会隐藏问题。
另一个选项是捕获抛出的异常,然后记录其内部消息-这通常是一个名为'what()'或类似的函数。这很可能会指出实际的问题所在。无论如何,你都可能想要捕获这个异常。
如果它的未定义行为导致了Release和Debug之间的差异,那么上面的方法可能就没有用了。
代码看起来很奇怪。
在不了解更多关于FileStorage对象的情况下,我可以看到您在堆栈的第一行上创建了一个。假设release()是某种引用计数方法,fs2.release()将尝试删除它,因为引用计数将为零。
不适合删除已经在堆栈上分配的对象。你会崩溃的。
任选(1),试试这个(即在堆上分配)
FileStorage fs2 = new FileStorage(fileName, FileStorage::READ);
(假设对象具有内置的引用计数语义;
或2:删除最后一行,因为fs2将在堆栈展开时超出作用域。
您需要添加"* "。当U处于发布模式时,再次将文件放到vs项目的链接器中。我认为这是openv 2.4.1之后的错误
在我的情况下,这是因为OpenCV库是用VS2010构建的,而我使用的是VS2015。
为了解决这个问题,我改变了我的项目属性>通用>平台工具集,以匹配用于构建我链接的opencv库的工具集。