私は 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;
}