[英]exception in release mode and not in debug mode
当我在调试模式下运行此代码时,没有异常出现,但是在发布模式下,出现此异常:
RealTimeSLT.exe中0x768b4b32处未处理的异常:Microsoft C ++异常:内存位置0x003de734处的cv :: Exception。
为什么这个问题只在发布时出现?我该如何解决?
FileStorage fs2(fileName, FileStorage::READ);
fs2.open(fileName, FileStorage::READ);
fs2["Mat"] >> Mat;
fs2["dMat"]>> dMat;
fs2.release();
假设您在VS中运行,请选择“调试”->“异常”,然后单击“引发异常时中断”
在调试器下运行该应用程序,并查看引发该异常的原因及其抱怨的原因-最有可能是应用程序在其下运行的环境中有所不同。
如果您需要检查变量,那么由于优化器可能会使调试器感到困惑,因此发行版本的构建会变得很难。 您可以通过在发行版本中关闭优化来解决此问题。 但是,如果是时间问题,则可能会隐藏问题。
另一个选择是捕获引发的异常,然后记录其内部消息-这通常是一个称为“ what()”或类似功能的函数。 这很可能会指出实际问题。 无论如何,您可能都想捕获此异常。
如果它的不确定行为导致了Release和Debug之间的差异,那么上面的用法可能就不会多用了。
代码看起来很奇怪。
在不了解FileStorage对象的情况下,我可以看到您已经在第一行的堆栈上创建了一个对象。
假设release()是某种参考计数方法,由于参考计数为零,fs2.release()将尝试删除它。
删除已在堆栈上分配的对象不是很好。 您会崩溃的。
可以选择(1)中的任何一种(即在堆上分配)
FileStorage fs2 = new FileStorage(fileName, FileStorage::READ);
(假设对象具有内置的引用计数语义;请检查文档)。
或2:删除最后一行,因为随着堆栈展开,fs2将超出范围。
在释放模式下,您需要再次将“ * .lib”文件添加到vs项目的链接器中。 我认为这是2.4.1之后的opencv的错误。
就我而言,这是因为OpenCV库是使用VS2010构建的,而我使用的是VS2015。
为了解决问题,我更改了“项目属性”>“常规”>“平台工具集”以匹配用于构建要链接的opencv库的工具集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.