发布模式下的异常,而不是调试模式

时间:2013-05-20 12:17:23

标签: c++ release-mode

当我在调试模式下运行此代码时,不会出现异常,但在发布模式下,我会收到此异常:

  

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();

4 个答案:

答案 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库的工具集。