2011-09-27 18 views
1

最終的に画像データを処理するためにいくつかの配列を使用する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)

これは私の質問につながります。これはメモリリークですか?もしそうなら、誰が漏れがどこにあるのかを見ることができますか?もしそうでなければ、誰かがこの問題をデバッグする方法を提案できますか?

+3

メモリリークによってアクセス違反が発生しません。何かあれば、あなたは反対の問題を抱えているようです。 –

+0

メモリリークはアクセス違反とほぼ反対です。 – Nawaz

+0

このコードは読めません。しかし、Xはスポットをマークし、キャストはコンパイラーがあなたに何か間違っていることを伝えるのを止めただけです。それはあなたが間違ってやってしまうのを止めませんでした。ヒープの破損が結果です。 –

答えて

2

あなたの最初の質問に答えるために、それはメモリリークではなく、メモリ破損です。 メモリリークは、使用しているメモリを解放していないため、メモリ使用量が増えています。これでプログラムは動作しませんが、あまりにも多くのメモリを使いすぎてしまい、結果的にコンピュータの速度が遅くなり(スワップ)、最終的には「メモリ不足です」というプログラムがクラッシュします。 C++で常に起こっている基本的なポインタエラーです。 デバッグの方法を説明するのは難しいです。クラッシュする直前にブレークポイントを追加し、何が間違っているかを確認することをお勧めします。

関連する問題