gpt4 book ai didi

c++ - 我*认为*我有内存泄漏。现在怎么办?

转载 作者:行者123 更新时间:2023-11-30 04:32:35 29 4
gpt4 key购买 nike

我创建了一个 C++ DLL 函数,它使用多个数组来处理最终的图像数据。我正在尝试通过引用传递这些数组,进行计算,然后通过预分配数组中的引用将输出传回。在该函数中,我使用了 Intel Performance Primitives,包括 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 个图像生成所需的输出,超过 6 个图像就会死掉:

DLL_test.exe 中 0x022930e0 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x1cdda000。

我试图调试该程序,不幸的是 VS 报告调用堆栈位置位于 IPP DLL 中,“没有可用的源”。调用 ippMagnitude32fc( (Ipp32fc*)X​​, R, DFTlen)

时始终失败

这引出了我的问题:这是内存泄漏吗?如果是这样,任何人都可以看到泄漏的位置吗?如果没有,有人可以建议如何着手调试这个问题吗?

最佳答案

回答您的第一个问题,不,这不是内存泄漏,而是内存损坏。内存泄漏是指您没有释放使用的内存,因此内存使用量会增加。这不会使程序无法运行,但最终只会使用过多的内存,这会导致计算机非常慢(交换)并最终导致任何程序因“内存不足错误”而崩溃。你所拥有的是基本的指针错误,因为它一直在 C++ 中发生。解释一下怎么debug比较难,建议你在crash之前加个断点,试试看哪里出了问题。

关于c++ - 我*认为*我有内存泄漏。现在怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572104/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com