我认为我有内存泄漏.现在什么
I *think* I have a memory leak. What now?
我创建了一个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张图像产生所需的输出,超过6张图像,它将终止:
First-chance exception at 0x022930e0 in DLL_test.exe: 0xC0000005: Access violation reading location 0x1cdda000.
我试图调试程序,不幸的是VS报告调用堆栈位置是在一个IPP DLL与"无源可用"。调用ippMagnitude32fc( (Ipp32fc*)X, R, DFTlen)
这导致我的问题:这是内存泄漏吗?如果是这样,有人能看到泄漏的位置吗?如果没有,有人能建议如何去调试这个问题吗?
回答你的第一个问题,不,这不是内存泄漏,这是内存损坏。内存泄漏是当您没有释放所使用的内存时发生的,因此,内存使用量正在增长。这不会使程序不工作,但最终只会使用太多的内存,这导致计算机非常慢(交换),最终任何程序崩溃与"内存不足的错误"。你得到的是基本的指针错误,这在c++中经常发生。解释如何调试是困难的,我建议您在崩溃之前添加一个断点,并尝试查看出错的地方。
相关文章:
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 您应该在什么时候创建自己的异常类型
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- "using namespace"子句在什么范围内有效?
- 传递链表而不在C++内存泄漏的情况下
- 可以在什么上下文中使用指针重排?
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- 在什么情况下,从流(结束)读取会导致停止?
- 在使用 boost 共享互斥体时,我应该在什么情况下使用 owns_lock() 函数
- 指针与参考示例,在什么情况下更好
- 我在内存泄漏和字符串方面遇到了一个非常奇怪的问题
- 如何在不泄漏内存的情况下删除链接列表
- C++ & C 中的".inc"文件有什么意义?您想在什么情况下使用它?
- 在什么情况下,C++编译器会推断出noexcept
- 在什么基础上,由单个元素组成的参数包的折叠表达式被转换为未加括号的表达式
- 在插入时同时迭代一个映射,这在什么方面是不安全的
- 在什么条件下,数据库在从 cpp 执行选择查询时不会关闭游标