【发布时间】: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<> 并且未在同一类中使用时。不过我只是删除了它,因为我不需要它。
如何触发:
我使用 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