0

当我在调试模式下运行此代码时,没有出现异常,但在发布模式下,我得到了这个异常:

RealTimeSLT.exe 中 0x768b4b32 处未处理的异常:Microsoft C++ 异常:cv::Exception at memory location 0x003de734..

为什么这个问题只在发布时出现?我该如何解决?

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

4 回答 4

2

假设您在 VS 中运行,请选择 Debug->Exceptions 并单击“抛出异常时中断”

在调试器下运行应用程序并查看引发该异常的原因以及它的抱怨 - 这很可能是应用程序运行环境中的不同之处。

如果您需要检查变量,那么发布构建会使这变得困难,因为优化器可能会使调试器感到困惑。您可以通过关闭发布版本中的优化来解决这个问题。但是,如果它是一个时间问题,这可能会隐藏问题。

另一种选择是捕获抛出的异常,然后记录其内部消息——这通常是一个名为“what()”或类似的函数。这很可能会指出实际问题。无论如何,您很可能想要捕获此异常。

如果它的未定义行为导致了 Release 和 Debug 之间的差异,那么上面的内容可能不会有那么多用处。

于 2013-05-20T12:23:03.493 回答
0

当您处于发布模式时,您需要再次将“*.lib”文件添加到 vs 项目的链接器。我认为这是 2.4.1 之后 opencv 的一个错误。

于 2014-09-23T09:08:14.067 回答
0

代码看起来很奇怪。

在不了解您的 FileStorage 对象的情况下,我可以看到您在第一行的堆栈上创建了一个。

假设 release() 是某种引用计数方法, fs2.release() 将尝试删除它,因为引用计数为零。

删除已在堆栈上分配的对象并不好。你会崩溃的。

无论是(1),试试这个(即在堆上分配)

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

(假设该对象具有内置的引用计数语义;请查看文档)。

或 2:删除最后一行,因为 fs2 将在堆栈展开时超出范围。

于 2013-05-20T12:22:51.173 回答
0

就我而言,这是因为 OpenCV 库是用 VS2010 构建的,而我使用的是 VS2015。

为了解决问题,我更改了我的项目属性 > 常规 > 平台工具集,以匹配用于构建我链接的 opencv 库的工具集。

于 2017-06-08T01:04:33.093 回答