繁体   English   中英

释放模式而不是调试模式下的异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM