【问题标题】:Why does my .exe file crash, but works just fine in debug and release version? [closed]为什么我的 .exe 文件崩溃,但在调试和发布版本中运行良好? [关闭]
【发布时间】:2015-06-03 04:04:58
【问题描述】:

我正在使用 openCV 2.4.11 技术创建一个控制台应用程序,我正在尝试使用透视变换从单个图像创建 30 多个图像。

我使用的是 matt 类而不是 IPLimages。

控制台应用程序的调试和发布版本工作,但是项目/发布文件夹中的 .exe 文件崩溃。

造成这种不同行为的可能原因是什么?

我应该提一下,发布版本也可以,它只是生成几张图片后崩溃的 .exe 文件。

【问题讨论】:

  • 您在征求猜测/意见(因此您的问题将被关闭);也就是说,仅在发布时崩溃的一个可能原因是您的应用程序中未定义的行为。
  • 控制台应用程序如何工作,但是 .exe 文件 [...] 崩溃?他们不是一回事吗?在您最后一次编辑之后,我倾向于同意上述@utnapistim 的评论。
  • 请检查mat.empty() 是否适用于您的任何输入。如果是这种情况,当您执行 .exe 或从开发环境中启动项目时,您的程序可能会使用不同的路径,这会导致程序崩溃(尝试访问无法找到/读取的 Mat)。
  • @Micka 没有解决我的问题...但感谢您的努力。

标签: c++ visual-studio opencv image-processing release


【解决方案1】:

此问题可能与使用 Visual Studio 编译器(也可能是其他编译器)时发布模式和调试模式之间的内存布局差异有关。

通俗地说,调试模式会为存储在内存中的每个对象添加一定数量的内存。如果你愿意的话,有点像填充物。由于您的越界访问(在释放模式下会产生分段错误)可能会落入此填充区域,因此不会触发分段错误(more details)。

尽管如此,这是您的代码中的一个错误,应该予以修复,例如通过使用assert 添加对空指针和越界访问的检查。

【讨论】:

  • 其他要检查的事情:启动线程时的错误时机(例如启动线程并假设它在下一条指令上完全初始化),未初始化的变量访问(如果在调试和调试之间未初始化,它们将具有不同的值release) 并修复任何编译警告。
  • @utnapistim 同意。这些东西也应该检查。
【解决方案2】:

我找到了一个解决方案,我只是从头开始初始化所有矩阵,现在 .exe 文件正在工作(尽管我仍然不确定我第一次搞砸了什么)。感谢大家的贡献。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多