我创建了一个C ++ DLL函数,它使用多个数组来处理最终的图像数据。我试图通过引用传递这些数组,进行计算,并在预先分配的数组中通过引用传递输出。在该函数中,我使用了Intel性能基元,包括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报告调用堆栈位置在“无源可用”的IPP DLL中。调用ippMagnitude32fc( (Ipp32fc*)X, R, DFTlen)
这引出了我的问题:这是内存泄漏吗?如果是这样,任何人都可以看到泄漏位置?如果没有,有人可以建议如何调试这个问题吗?
答案 0 :(得分:2)
要回答你的第一个问题,那不是内存泄漏,那就是内存损坏。 内存泄漏是指您不释放所使用的内存,因此内存使用量正在增长。这不会使程序无法工作,但最终只会占用太多内存,导致计算机速度非常慢(交换),最终任何程序都会因“内存不足错误”而崩溃。 你所拥有的是基本的指针错误,因为它一直在C ++中发生。 解释如何调试很难,我建议你在崩溃之前添加一个断点,并试着看看有什么不对。