最終的に画像データを処理するためにいくつかの配列を使用するC++ DLL関数を作成しました。私は、これらの配列を参照渡しに渡し、計算を行い、あらかじめ割り当てられた配列内の参照によって出力を戻します。私は関数ippsMallocとippsFreeを含むインテルパフォーマンス・プリミティブを使用して関数内:私は思います*私はメモリリークを持っています。今何?
Process.dll
int __stdcall ProcessImage(const float *Ref, const float *Source, float *Dest, const float *x, const float *xi, const int row, const int col, const int DFTlen, const int IMGlen)
{
int k, l;
IppStatus status;
IppsDFTSpec_R_32f *spec;
Ipp32f *y = ippsMalloc_32f(row),
*yi = ippsMalloc_32f(DFTlen),
*X = ippsMalloc_32f(DFTlen),
*R = ippsMalloc_32f(DFTlen);
for (int i = 0; i < col; i++)
{
for (int j = 0; j < row; j++)
y[j] = Source[j + (row * i)];
status = ippsSub_32f_I(Ref, y, row);
// Some interpolation calculations calculations here
status = ippsDFTInitAlloc_R_32f(&spec, DFTlen, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone);
status = ippsDFTFwd_RToCCS_32f(yi, X, spec, NULL);
status = ippsMagnitude_32fc((Ipp32fc*)X, R, DFTlen);
for (int m = 0; m < IMGlen; m++)
Dest[m + (IMGlen * i)] = 10 * log10(R[m]);
}
_CrtDumpMemoryLeaks();
ippsDFTFree_R_32f(spec);
ippsFree(y);
ippsFree(yi);
ippsFree(X);
ippsFree(R);
return(status);
}
関数呼び出しは次のようになります。
for (int i = 0; i < Frames; i++)
ProcessFrame(&ref[i * FrameSize], &source[i * FrameSize], &dest[i * FrameSize], mX, mXi, NumPixels, Alines, DFTLength, IMGLength);
関数は失敗し、最大6つのイメージに対する所望の出力を生成しません。 、それよりも、それはで死ぬ:
First-chance exception at 0x022930e0 in DLL_test.exe: 0xC0000005: Access violation reading location 0x1cdda000.
私は残念ながら、VSのプログラムをデバッグしようとしてきましたコールスタックの場所が "No Source Available"のIPP DLLにあることを報告します。 ippMagnitude32fc((Ipp32fc*)X, R, DFTlen)
これは私の質問につながります。これはメモリリークですか?もしそうなら、誰が漏れがどこにあるのかを見ることができますか?もしそうでなければ、誰かがこの問題をデバッグする方法を提案できますか?
メモリリークによってアクセス違反が発生しません。何かあれば、あなたは反対の問題を抱えているようです。 –
メモリリークはアクセス違反とほぼ反対です。 – Nawaz
このコードは読めません。しかし、Xはスポットをマークし、キャストはコンパイラーがあなたに何か間違っていることを伝えるのを止めただけです。それはあなたが間違ってやってしまうのを止めませんでした。ヒープの破損が結果です。 –