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