我正在使用 OpenCV 来计算 ORB 描述符,我遇到的问题是在执行过程中的随机点出现这样的错误
LightFieldRecovery(3468,0x7fff73a9a310) malloc: * 对象 0x100911608 错误:已释放对象的校验和不正确 - 对象可能在被释放后被修改。*在 malloc_error_break 中设置断点进行调试
我没有使用任何指针(明确地)我使用 std::vectors 作为数据容器。代码太长,无法在此处发布,但您可以看到它https://github.com/BRabbit27/LigthField/blob/master/LightFieldRecovery/main.cpp
有没有人能发现这个错误在哪里?我整天都在找它。
我在 OS X Mavericks、Xcode 5 和 C++ 下工作(在 Xcode 的 Build Settings 下,C++ Language Dialect设置为-std=gnu++11否则我无法编译 OpenCV 代码)
编辑
在 Valgrind 的帮助下,我能够将问题缩小到以下代码段,但我看不出错误是什么,我不明白将数据从 a 复制cv::Mat
到uchar*
指针时我错过了什么。
错误 A
//GET THE RIGHT AND DOWN NEIGHBORS TO COMPUTE THE DIFFERENCES
uint offset = 0;
for (Pixel p : patchPos)
{
uint r = p.getY();
uint c = p.getX();
uchar pixelV = ((uchar*)camRef->getData())[r*imageW+c];
uint cRightNeighbor = c+patchStep;
uchar pixelVrightP = 0;
if (cRightNeighbor < imageW)
{
pixelVrightP = abs(pixelV - ((uchar*)camRef->getData())[r*imageW+cRightNeighbor]);
}
uint rDownNeighbor = r+patchStep;
uchar pixelVbelowP = 0;
if (rDownNeighbor < imageH)
{
pixelVbelowP = abs(pixelV - ((uchar*)camRef->getData())[rDownNeighbor*imageW+c]);
}
//THIS IS PART OF THE ERROR
Cdiff[iPatch*(patchSize*patchSize)*2 + offset] = pixelVrightP;
Cdiff[iPatch*(patchSize*patchSize)*2 + offset+(patchSize*patchSize)] = pixelVbelowP;
offset++;
}
错误 B
显然我假装使用memset
的方式不是一个好方法。
for (uint dRow = 0; dRow < camPatchKeyPoints.size(); dRow++)
{
if (camPatchKeyPoints[dRow].pt.x < 0 || camPatchKeyPoints[dRow].pt.y < 0 ||
camPatchKeyPoints[dRow].pt.x > imageW || camPatchKeyPoints[dRow].pt.y > imageH)
{
memset(&(d.data[dRow*d.cols]), 0, sizeof(uchar)*d.cols);
}
}
错误 C
同样,memcpy
我传递了错误的参数或复制到越界区域
dst = Q;
for (uint dl = 0; dl < disparityLevels; dl++)
{
for (uint c = 0; c < (nTotalCams-1); c++)
{
memcpy(dst, &(((uchar*)(camsDescriptors[c].data))[dl*DESCRIPTOR_SIZE]), sizeof(uchar)*DESCRIPTOR_SIZE);
dst += DESCRIPTOR_SIZE;
}
}
错误 D
dst = Y;
for (cv::Mat refD : refsDescriptors)
{
memcpy(dst, refD.data, sizeof(uchar)*DESCRIPTOR_SIZE);
dst += DESCRIPTOR_SIZE;
}