2016-08-26 2 views
-3

Я имею следующую структуру кода:Странное поведение программы

[code 1] 
cout << some_string << endl 
cout << some_string << endl 
cout << some_string << endl 
cout << some_string << endl 
cout << some_string << endl 
[code 2] 

Когда я удаляю cout заявления, код 2 дает другой результат, когда он дает, когда cout заявления присутствуют. Является ли это признаком утечки памяти?

Конкретный пример - от stitching_detailed.cpp от OPENCV. У меня есть следующий фрагмент кода:

// code 1 - edit added cameras initialization 
vector<CameraParams> cameras(0); 
HomographyBasedEstimator estimator; 
theRNG().state = 0; 
estimator(features, pairwise_matches, cameras); 
for (size_t i = 0; i < cameras.size(); ++i) 
{ 
    theRNG().state = 0; 
    Mat R; 
    cameras[i].R.convertTo(R, CV_32F); 
    cameras[i].R = R; 
    LOGLN("Initial intrinsics #" << indices[i]+1 << ":\n" << cameras[i].K()); 
} 
// cout statements 
for (size_t i = 0; i < cameras.size(); ++i) 
{ 
    cout << cameras[i].aspect << endl; 
    cout << cameras[i].focal << endl; 
    cout << cameras[i].K() << endl; 
    cout << cameras[i].ppx << endl; 
    cout << cameras[i].ppy << endl; 
    cout << cameras[i].R << endl; 
    cout << cameras[i].t << endl; 
} 
// code 2 
theRNG().state = 0; 
Ptr<detail::BundleAdjusterBase> adjuster; 
if (ba_cost_func == "reproj") adjuster = new detail::BundleAdjusterReproj(); 
else if (ba_cost_func == "ray") adjuster = new detail::BundleAdjusterRay(); 
else 
{ 
    cout << "Unknown bundle adjustment cost function: '" << ba_cost_func << "'.\n"; 
    return -1; 
} 
theRNG().state = 0; 
Mat_<uchar> refine_mask = Mat::zeros(3, 3, CV_8U); 
if (ba_refine_mask[0] == 'x') refine_mask(0,0) = 1; 
if (ba_refine_mask[1] == 'x') refine_mask(0,1) = 1; 
if (ba_refine_mask[2] == 'x') refine_mask(0,2) = 1; 
if (ba_refine_mask[3] == 'x') refine_mask(1,1) = 1; 
if (ba_refine_mask[4] == 'x') refine_mask(1,2) = 1; 
adjuster->setRefinementMask(refine_mask); 
adjuster->setConfThresh(conf_thresh); 

(*adjuster)(features, pairwise_matches, cameras); 

Если удалить cout заявления, камеры [х] .focal является NaN. Если я сохраняю cout, то камеры [x] .фокал имеют допустимые значения.

Я знаю, что его не много, чтобы дать, но я в конце своих усилий, чтобы отладить его. Любая помощь в отладке проблемы приветствуется. Даже если вы знаете стандартный способ отладки, сообщите мне.

+4

' Является ли это признаком утечки памяти? Нет, [неопределенное поведение] (https://en.wikipedia.org/wiki/Undefined_behavior). –

+0

Вы использовали отладчик, чтобы пройти через линии и посмотреть переменные? –

+0

@ Torbjörn Я использую интерфейс CLI/C++ для этого кода на C++. Отладка C#, C++/CLI, кода на C++ слишком сложна в Visual Studio. Короче говоря, я не могу пройти через это. – ubaabd

ответ

3

Если вы подвергаете ошибки путем удаления, казалось бы, не связанного кода, что почти всегда является признаком неопределенного поведения ошибки настоящего где-то в вашей программе, которые не находятся в состоянии покоя, пока ваши изменения макета памяти программы очень немного.

Что касается неопределенного поведения, которое может вызвать такие ошибки, существует несколько вариантов. Неинициализированные указатели, указатели, указывающие на неправильное место, массив вне границ ошибок и т.д. и т.п.

(Вы также можете получить такого рода поведение от переполнения стека, хотя это кажется маловероятным в этом случае.)

+0

Поскольку OPENCV не в моих руках, поэтому не могу отлаживать любые неинициализированные указатели в OPENCV. Есть ли способ, которым я могу это исправить (даже любой грязный трюк, который работает). Мне нужно доставить код как можно скорее. – ubaabd

+0

Я сомневаюсь, что OpenCV дает неинициализированные указатели. Вы должны перечитать документацию/учебник. Скорее всего, вы пропустили точку. –

+0

@ubaabd Не знаю, извините. Это действительно очень широкая тема, может быть любая ошибка в вашем коде, вызывающая это. Я бы посмотрел на все инициализации переменных, чтобы убедиться, что не используется неинициализированная переменная. Статический анализатор кода очень удобен для поиска таких ошибок. – Lundin

Смежные вопросы