Malloc错误:在push_back Vector时使用OpenCV / C ++

时间:2016-09-29 07:57:28

标签: c++ opencv vector malloc

我尝试使用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 Analysis说,我的应用程序使用9 Mb内存。我试图调试错误,但它非常复杂,我没有找到任何线索,错误来自。

修改 我想知道是否会出现此错误,因为我尝试访问传递给calcOrientationHist(...)的Image Pixel值,img.at<sift_wt>(...)其中typdef float sift_wt位于第56行,而我的代码中为57,因为通常是Patch我传递类型0的输出,这意味着它是CV_8UC1但是,我从sift.cpp at Line 330 and 331复制了这部分。通常,SIFT描述符也应该有灰度图像?

EDIT2 更改img.at<sift_wt>(...)位置中的类型后,没有任何更改。所以我用Google搜索了解决方案并从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 个答案:

答案 0 :(得分:0)

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

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