Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 程序的奇怪行为_C++_Opencv_Memory Leaks - Fatal编程技术网

C++ 程序的奇怪行为

C++ 程序的奇怪行为,c++,opencv,memory-leaks,C++,Opencv,Memory Leaks,我有以下代码结构: [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语句,摄影机[x]。焦点

我有以下代码结构:

[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
语句,摄影机[x]。焦点为NaN。如果我保留
cout
语句,则摄影机[x].focal具有有效值


我知道这不需要付出太多,但我的调试工作已经结束。非常感谢您对调试此问题的任何帮助。即使您知道调试它的标准方法,也请告诉我。

如果您通过删除看似不相关的代码来暴露错误,这几乎总是程序中存在未定义行为错误的迹象,这些错误会一直处于休眠状态,直到您的程序内存布局发生微小变化

至于什么样的未定义行为会导致这样的错误,有多种选择。未初始化的指针、指向错误位置的指针、数组越界错误等


(您也可以从堆栈溢出中获得这种行为,虽然在这种情况下似乎不太可能)。

<代码>这是内存泄漏的指示吗?< /代码> Noop.您是否使用调试器来跨行并监视变量?@ TrbjjOrn,我使用CLI/C++接口来执行此C++代码。在Visual Studio中调试C、C++、CLI、C++代码是非常困难的。总之,我不能通过它。UVisBAD调试C,C++,CLI,C++代码在VisualStudio中太难了。我不知道你做错了什么,但这不是真的。@ubabd——你要么1)没有将C#project中的“Debug”选项设置为“Native Debug”,要么2)你的DLL没有加载调试符号,或者3)你认为你正在调试的C++ DLL不是正在加载的C++。因为OpenCV不在我的手中,所以不能真正调试OpenCV中的任何未初始化的指针。有没有办法解决这个问题(即使是任何肮脏的伎俩)。我需要尽快交付代码。我怀疑OpenCV是否提供了未初始化的指针。您应该重新阅读文档/教程。很可能你漏掉了一点。@ubabad不知道,对不起。这确实是一个非常广泛的主题,代码中任何地方都可能存在导致此问题的bug。我将额外检查所有变量的初始化,确保没有未初始化的变量被使用。静态代码分析器对于查找此类错误非常方便。@Lundin我在代码中只使用了向量和Mat对象。我从来没有尝试过自己管理内存。不过,我仍将研究未初始化的变量。@Lundin显然有一个指针
Ptr finder原始OPENCV示例正在使用
finder->collectGarbage()释放。我添加了一行
finder.release()在它前面,这似乎解决了问题。我不确定这是否真的是原因。我在所有Ptr对象之后调用了release()函数。
// 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);