【发布时间】:2012-08-28 07:34:00
【问题描述】:
我遇到了程序中的堆损坏问题。在程序中,我正在读取一个数据块并对其执行 FFT 和 IFFT。我正在为 2 个图像(主从图像)做这件事。完全相同的代码对主服务器运行良好,但在我尝试删除从属缓冲区时显示从属文件的堆损坏。
fcomplex 定义为:
typedef struct {float real, imag;}fcomplex;
附上相关部分代码的sn-p: 完整代码:http://sharetext.org/7xXe
如果我不为从映像调用 fft 和 ifft 函数,则不会发生错误。 (不过对于主人来说一切都很好)
为了调试错误,我安装了应用程序验证程序,但我无法解码日志文件。它在这里:http://sharetext.org/Y2ji(XML 文件复制粘贴)
视觉工作室给出的错误是: 检测到堆损坏:在 0x062C0040 的正常块 (#194456) 之后
CCoarseFun::fcomplex * slave_bfr;
CCoarseFun::fcomplex * slave_col;
slave_bfr = Pcoarse.init_1Dcmplx(SIZE*s_cols);
slave_col = Pcoarse.init_1Dcmplx(SIZE);
Pcoarse.cfft1d_(&SIZE,slave_col,&FFTdir); // This function causes a problem
Pcoarse.complex_mult_col(filter, slave_col, SIZE, slave_col)
Pcoarse.cfft1d_(&SIZE,slave_col,&FFTdir); // As does this one
// delete memory related to slave
delete [] slave_bfr; // Heap corruption here
delete [] slave_col;
让我感到困惑的是代码非常简单,而且它 100% 仅适用于主文件。为什么slave会崩溃?
有人可以指导我找到解决方案,或者也可以提供有关如何使用应用程序验证器的教程吗?
谢谢, 肖纳克
编辑:使用 Win7 x64 - VS2010
编辑 2:init_1Dcmplx 的定义
CCoarseFun::fcomplex* CCoarseFun::init_1Dcmplx(int n)
{
fcomplex *a;
a=new fcomplex[n];
for(int i=0;i<n;i++)
{
a[i].real=float(0.0);
a[i].imag=float(0.0);
}
return a;
}
EDIT3:cfft1D_ 的代码:http://sharetext.org/hzIg
EDIT4:mem.delfloat() 的代码
void CMemAlloc::del_float(float *a)
{
if (a!=NULL)
{
delete[] a;
a=NULL;
}
else
{
return;
}
}
【问题讨论】:
-
init_1Dcmplx是如何定义的?它是否使用new ...[]来分配结构? -
@nneonneo 是的。请参阅 EDIT2
-
贴出cfft1d_的代码,相关部分。
-
@lyricat sharetext.org/hzIg
-
好吧,del_float 不太正确。它正在删除数组,但它并没有像看起来那样将指针设置回 NULL。那是因为它在指针的副本上进行操作。但是之后没有使用指针,所以我认为这不是最终原因。
标签: c++ mfc heap-corruption