Почему простое включение SegmentedBounds
вызывает повреждение стека? Он никогда не используется (пока), и я могу продолжить через программу после предупреждения о коррупции без каких-либо явных побочных эффектов.
У меня есть проект 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
только объявлен и нигде (пока) не используется. Комментируя это «исправляет» эту проблему.
Кроме того, если переменная имеет тип Bounds*
Там нет коррупции. Похоже, если след памяти ImageVariants
превышает определенный размер, то мы получаем проблемы.
Это также произошло раньше, при тех же обстоятельствах, когда STL vector<>
был объявлен и не используется в том же классе. Я просто удалил его, так как он мне не нужен.
Как это срабатывает:
Я использовал инструменты OpenGV 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()
просто возвращается Original
от ImageVariants
учебный класс. Он не получает доступ, не устанавливает и не использует SegmentedBounds
в любом случае.
Что я знаю:
Bounds
тип, который вы видите связанным с переменной, на самом деле просто причудливая структура. Он очень тщательно используется многими способами по всей программе без каких-либо проблем.Bounds
Тип прошел все свои строгие модульные и интеграционные тесты, поэтому в этом нет ничего принципиального.После двух недель борьбы я нашел ответ. По-видимому, некоторые функции некоторых модулей OpenCV требуют вызова функции для инициализации модуля перед его использованием:
initModule_<module name>();
Я не упомянул об этом в своем вопросе, но я использовал features2d
Модуль в этом классе. В частности, я использовал KeyPoints
объект из этой библиотеки. Итак, в конструкторе я добавил:
initModule_features2d();
Все мои проблемы ушли, никакой странности не понадобилось. Я не уверен, почему эти функции полностью недокументированы, поскольку я нигде не могу найти, что они даже делают, но они работают.
Кредит: ник из эта почта заставил меня осознать эти функции и спас мое сало, большое время.