Malloc 错误:OpenCV/C++ 而 push_back 向量

Posted

技术标签:

【中文标题】Malloc 错误:OpenCV/C++ 而 push_back 向量【英文标题】:Malloc Error: OpenCV/C++ while push_back Vector 【发布时间】:2016-09-29 07:57:27 【问题描述】:

我尝试创建一个描述符,使用 FAST 进行点检测,使用 SIFT 构建描述符。为此,我使用 OpenCV。当我使用 OpenCV 的 FAST 时,我只使用了部分 SIFT 代码,因为我只需要描述符。现在我有一个非常讨厌的 malloc 错误,我不知道如何解决它。我将我的代码发布到GitHub,因为它很大而且我真的不知道错误来自哪里。我只知道,它是在 DO-WHILE-Loop 结束时创建的:

    features2d.push_back(features);
    features.clear();
    candidates2d.push_back(candidates);
    candidates.clear();
    
while(candidates.size() > 100);

正如您在 GitHub 的代码中看到的,我已经尝试释放应用程序的内存。 Xcode 分析说,我的应用程序使用 9 Mb 内存。我试图调试错误,但它非常复杂,我还没有找到错误来自哪里的任何线索。

编辑 我想知道是否会发生此错误,因为我尝试使用img.at<sift_wt>(...) 访问传递给 calcOrientationHist(...) 的图像像素值,其中typdef float sift_wt 在第 56 行和代码中的 57,因为通常我传递的补丁输出输入0,这意味着它是CV_8UC1 但是,我从sift.cpp at Line 330 and 331 复制了这部分通常SIFT 描述符也应该有灰度图像?

EDIT2 更改 img.at<sift_wt>(...)Position 中的类型后,没有任何变化。所以我搜索了解决方案并从 XCode 中找到了 GuardMalloc 功能。启用它向我显示了一个新错误,这可能是我得到 Malloc 错误的原因。在线77 of my Code。它在这一行给我的错误是EXC_BAD_ACCESS (Code=1, address=....) 有以下几行:

for( k = 0; k < len; k ++)
    int bin = cvRound((n/360.f)+Ori[k]);
    if(bin >= n)
        bin -=n;
    if(bin < 0 )
        bin +=n;
    temphist[bin] += W[k]*Mag[k];

上述变量的值如下: bin = 52, len = 169, n = 36, k = 0, W, Mag, Ori and temphist 未显示。

这里是 GuadMalloc 输出(抱歉,我真的不明白它到底想要什么)

GuardMalloc[Test-1935]: Allocations will be placed on 16 byte boundaries.
GuardMalloc[Test-1935]:  - Some buffer overruns may not be noticed.
GuardMalloc[Test-1935]:  - Applications using vector instructions (e.g., SSE) should work.
GuardMalloc[Test-1935]: version 108
Test(1935,0x102524000) malloc: protecting edges
Test(1935,0x102524000) malloc: enabling scribbling to detect mods to free blocks 

【问题讨论】:

【参考方案1】:

答案很简单... 问题是,在 For 循环中计算 Bin 时出现了错误的值。而不是添加ori[k],它应该是与ori[k] 的乘法。 那里的错误导致 bin 值为 52。但是temphist 指向的数组的长度是 38。

对于所有有类似错误的人,我真的建议使用 GuardMalloc 或 Valgrind 来调试 Malloc 错误。

【讨论】:

以上是关于Malloc 错误:OpenCV/C++ 而 push_back 向量的主要内容,如果未能解决你的问题,请参考以下文章

malloc中的电子围栏段错误

使用 gcc 而不是 icpc 编译时未定义的引用运行时错误 __intel_ssse3_rep_memcpy、_mm_free、_mm_malloc 链接器错误

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

OPENCV / C++: approxpolydp 断言失败错误

free函数和malloc函数

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?