gpt4 book ai didi

c++ - MFC 程序中的堆损坏

转载 作者:行者123 更新时间:2023-11-28 07:58:17 25 4
gpt4 key购买 nike

我在程序中遇到堆损坏问题。在程序中,我正在读取一个数据 block 并对其执行 FFT 和 IFFT。我正在为 2 个图像,master 和 slave 做这件事。完全相同的代码适用于主服务器,但当我尝试删除从缓冲区时显示从文件的堆损坏。

fcomplex 定义为:

typedef struct {float real, imag;}fcomplex;

附上代码相关部分的片段:完整代码:http://sharetext.org/7xXe

如果我不为从图像调用 fft 和 ifft 函数,则不会发生错误。 (不过对于 master 来说一切正常)

为了调试错误,我安装了应用程序验证器,但无法解码日志文件。它在这里:http://sharetext.org/Y2ji(复制粘贴的 XML 文件)

Visual Studio 给出的错误是:检测到堆损坏:在 0x062C0040 处的正常 block (#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;
}
}

最佳答案

mem_float() 函数不正确。看起来它在删除后将指针设置为 NULL,但它只在指针的拷贝上工作,因此调用者的拷贝仍指向已删除的内存块。

你可以这样做

delete [] cf;
cf = NULL;

你有几行看起来像这样:

four1(cf-1,nn,isign);

我认为这是访问数组开头之前的内存。

除此之外,four1() 中的索引非常复杂 - 您将不得不使用调试器逐步检查它以检查边缘情况。

关于c++ - MFC 程序中的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12154706/

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