Вопросом фронтом
Почему простое включение SegmentedBounds
вызывая повреждение стека? Он никогда не используется (пока), и я могу продолжить программу после предупреждения о коррупции без каких-либо очевидных негативных последствий.OpenCV: Stack Коррупция с неиспользуемым переменной
Подробности
У меня есть проект OpenCV 2.4.10 в Visual Studio 2013, который внезапно начал вызывая ошибку стека коррупции:
Run-Time Check Failure #2 - Stack around the variable 'was_processed' was corrupted!
Интересно, что это является частью OpenCV рамки, а не мой код. Он не работает в sources/modules/highgui/src/window_w32.cpp
в функции WindowProc()
.
Я могу продолжить программу без видимых побочных эффектов.
Вот их код:
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
только объявлен и не (пока) использовали anyw Вот. Комментируя это, «исправляет» эту проблему.
Кроме того, если переменная имеет тип Bounds*
, нет никакого искажения. Похоже, если объем памяти ImageVariants
превышает определенный размер, мы получаем проблемы.
Это также произошло раньше, при тех же обстоятельствах, когда STL vector<>
был объявлен и не использовался в том же классе. Я просто удалил его, так как мне это не нужно.
Как это срабатывает:
Я использовал инструменты HighGUI OpenCV, чтобы взаимодействовать с программой. Всякий раз, когда я получить доступ к функции из ImageVariants
класса, представляется Bork:
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()
просто возвращает Original
из ImageVariants
класса. Он не имеет доступа, установки или использования SegmentedBounds
в любом случае.
То, что я знаю:
- Я очень опытный C++ разработчик, так что такие вещи, как «вы не знаете, что вы делаете», только неинициализированного переменной, петля из границ, Вы копировали и вставляли код? и т. д. ... не требуется. Этот код очень хорошо написан и понят.
- Тип
Bounds
, который вы видите связанным с переменной, просто на самом деле просто причудливая структура. Он очень тщательно используется во многих программах без проблем. - Тип
Bounds
прошел все его строгие испытания на единицу и интеграцию, поэтому в этом нет ничего принципиально неправильного.