【问题标题】:Strange Behavior of a Program [closed]程序的奇怪行为[关闭]
【发布时间】:2017-01-02 17:48:01
【问题描述】:

我的代码结构如下:

[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 语句时给出不同的输出。这是否表明存在内存泄漏?

具体例子来自OPENCV的stitching_detailed.cpp。我有以下代码块:

// 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 语句,cameras[x].focal 是 NaN。如果我保留cout 语句,则cameras[x].focal 具有有效值。

我知道它的付出并不多,但我正在努力调试它。任何调试问题的帮助表示赞赏。即使您知道调试它的标准方法,也请告诉我。

【问题讨论】:

  • Is this an indication of some memory leak? 不,undefined behavior.
  • 您是否使用过调试器来逐行查看变量?
  • @Torbjörn 我正在为这个 C++ 代码使用 CLI/C++ 接口。在 Visual Studio 中调试 C#、C++/CLI、C++ 代码太难了。简而言之,我无法通过它。
  • @ubaabd 在 Visual Studio 中调试 C#、C++/CLI、C++ 代码太难了。 -- 我不知道你做错了什么,但这不是真的。
  • @ubaabd -- 你要么 1) 没有将 C# 项目中的 "Debug" 选项设置为 "Native Debugging",要么 2) 你的 DLL 没有加载调试符号,或者 3 ) 你认为你正在调试的 C++ DLL 不是正在加载的那个。

标签: c++ opencv memory-leaks


【解决方案1】:

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

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

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

【讨论】:

  • 由于 OPENCV 不在我的手中,所以无法真正调试 OPENCV 中任何未初始化的指针。有没有办法可以解决这个问题(即使是任何有效的肮脏技巧)。我需要尽快交付代码。
  • 我怀疑 OpenCV 给出了未初始化的指针。您应该重新阅读文档/教程。您很可能错过了一点。
  • @ubaabd 不知道,抱歉。这确实是一个非常广泛的话题,您的代码中的任何地方都可能存在导致此问题的任何错误。我会额外查看所有变量初始化,确保没有使用未初始化的变量。静态代码分析器对于查找此类错误非常方便。
  • @Lundin 我在我的代码中只使用了向量和 Mat 对象。我没有尝试自己管理内存。不过,我仍然会研究未初始化的变量。
  • @Lundin 显然有一个指针 Ptr&lt;FeaturesFinder&gt; finder; 原来的 OPENCV 示例正在使用 finder-&gt;collectGarbage(); 释放。我在它前面添加了finder.release(); 行,这似乎解决了问题。我不确定这是否真的是原因。我在所有 Ptr 对象之后调用了 release() 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 2016-02-16
相关资源
最近更新 更多