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 向量的主要内容,如果未能解决你的问题,请参考以下文章
使用 gcc 而不是 icpc 编译时未定义的引用运行时错误 __intel_ssse3_rep_memcpy、_mm_free、_mm_malloc 链接器错误
在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误