【问题标题】:OpenCV: Stack Corruption with Unused VariableOpenCV:堆栈损坏与未使用的变量
【发布时间】:2015-03-28 05:22:01
【问题描述】:

提前提问

为什么简单地包含 SegmentedBounds 会导致堆栈损坏?它从未使用过(还),我可以在收到损坏警告后继续执行该程序,而不会产生任何明显的不利影响。


详情

我在 Visual Studio 2013 中有一个 OpenCV 2.4.10 项目,它突然开始导致堆栈损坏错误:

Run-Time Check Failure #2 - Stack around the variable 'was_processed' was corrupted!

有趣的是,这是 OpenCV 框架的一部分,而不是我的代码。它在 WindowProc() 函数中的 sources/modules/highgui/src/window_w32.cpp 内部失败。

不过,我可以继续执行该计划而没有明显的不利影响。

这是他们的代码:

static LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    LRESULT ret;

    if( hg_on_preprocess )
    {
        int was_processed = 0;
        int rethg = hg_on_preprocess(hwnd, uMsg, wParam, lParam, &was_processed);
        if( was_processed )
            return rethg;
    }
    ret = HighGUIProc(hwnd, uMsg, wParam, lParam);

    if(hg_on_postprocess)
    {
        int was_processed = 0;
        int rethg = hg_on_postprocess(hwnd, uMsg, wParam, lParam, &was_processed);
        if( was_processed )
            return rethg;
    }

    return ret;
} // <================= Debugger says it stopped here

这是我的代码:

class ImageVariants {
public:
    Mat getOriginal() const;
    ...

private:
    Point3i Bounds3D;
    SubjectFace Face;
    Mat Mask;
    Mat Original;
    Bounds SegmentedBounds; // PROBLEMS
    Bounds Subject;

    bool boundsSet = false;
};

失败的地方:

这是踢球者,SegmentedBounds 仅被声明并且(尚未)在任何地方使用。将其注释掉“修复”了这个问题。

此外,如果变量的类型为Bounds*,则不会出现损坏。看起来如果ImageVariants 的内存占用超过一定大小,就会出现问题。

这也发生在之前,在完全相同的情况下,当声明 STL vector&lt;&gt; 并且未在同一类中使用时。不过我只是删除了它,因为我不需要它。

如何触发:

我使用 OpenCV 的 HighGUI 工具与程序进行交互。每当我从 ImageVariants 类访问一个函数时,它似乎很糟糕:

Scalar color(255.0, 0.0, 0.0);
Point end(x, y);

//Draw the rectangle the user is drawing
Mat img = w->Segmenter.Variants.getOriginal();

rectangle(img, w->MouseStart, end, color, 1, 8, 0);
w->draw(&img);

getOriginal() 只是从 ImageVariants 类返回 Original。它不会以任何方式访问、设置或使用SegmentedBounds。

我所知道的:

  • 我是一位非常有经验的 C++ 开发人员,所以诸如“你不知道自己在做什么”之类的东西,只是一个未初始化的变量,循环越界,你复制粘贴代码了吗?等等...不需要申请。这段代码写得很好,很好理解。
  • 您看到的与变量关联的Bounds 类型实际上只是一个花哨的结构。它在整个程序的许多方面都得到了非常彻底的使用,没有任何问题。
  • Bounds 类型已通过其所有严格的单元和集成测试,因此没有根本性的问题。

【问题讨论】:

    标签: c++ debugging opencv stack-corruption


    【解决方案1】:

    经过大约两周的努力,我找到了答案。显然,某些 OpenCV 模块的某些功能需要您在使用之前调用一个函数来初始化模块:

    initModule_<module name>();
    

    我没有在我的问题中提到这一点,但我在这个类中使用了features2d 模块。具体来说,我使用的是该库中的 KeyPoints 对象。所以,在构造函数中我添加了:

    initModule_features2d();
    

    我所有的问题都消失了,不需要奇怪。我不确定为什么这些函数完全没有文档记录,因为我在任何地方都找不到它们的功能,但它们可以工作。

    Credit:来自this post 的nikk 让我意识到了这些功能,并节省了我的培根,非常重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多