C++ 版本与调试版本:突然出现运行时错误

C++ 版本与调试版本:突然出现运行时错误,c++,arrays,runtime,C++,Arrays,Runtime,我有一个在2d阵列上执行FFT的程序。为了使用fft库fftw3,我必须使用一个名为FTtemp的临时数组来读取fft的结果:它是3d的,因为它包含x&y轴加上每个x,y元组的实值和虚值 从具有特殊变量类型的FFT阵列到普通阵列的数据传输工作在调试模式下,但不在释放模式下。在版本中,我得到以下运行时错误:访问冲突写入位置0x02913000 在我的谷歌搜索中,我发现发布版本错误通常与未初始化的对象有关。这导致我用0.0显式初始化FTtemp中的每个项目,但是没有用。此外,我将FFt数组项打印到控

我有一个在2d阵列上执行FFT的程序。为了使用fft库fftw3,我必须使用一个名为FTtemp的临时数组来读取fft的结果:它是3d的,因为它包含x&y轴加上每个x,y元组的实值和虚值

从具有特殊变量类型的FFT阵列到普通阵列的数据传输工作在调试模式下,但不在释放模式下。在版本中,我得到以下运行时错误:访问冲突写入位置0x02913000

在我的谷歌搜索中,我发现发布版本错误通常与未初始化的对象有关。这导致我用0.0显式初始化FTtemp中的每个项目,但是没有用。此外,我将FFt数组项打印到控制台,并显示数字,这意味着它们也已初始化。因此,我有点不知所措,想知道是否有人比我更聪明

下面是我要说的代码片段。由于该程序依赖于许多其他东西,我还不能重新创建一个最小的示例,但一旦我得到相同的错误,我将添加一个

有趣的事实:我将循环的I&j值打印到控制台进行故障排除,这是另一个I,j图,每次运行时它都会崩溃:例如:49212或116169。我真的被这搞糊涂了

        FTtemp = new double** [width];
        for (i = 0; i < width; i++) {
            FTtemp[i] = new double*[height];
        }
        for ( i = 0; i < width; i++)
        {
            for (j = 0; j < height; j++) {
                FTtemp[i][j] = new double[2]; 
                FTtemp[i][j][0] = 0.0;
                FTtemp[i][j][1] = 0.0;
            }
        }

        cout << "width,height: " << width << "," << height << endl;
        for (i = 0; i < width; i++)
        {
            for (j = 0; j < height; j++) {
                /*
                cout << "access to out: " << out[indexFFT(i, j)][0] << endl;
                cout << "access to FTtemp: " << FTtemp[i][j][1] << endl;
                */
                cout << "i,j is: " << i << "," << j << endl;
                FTtemp[i][j][1] = out[indexFFT(i, j)][0]; <--------- error occours here
                FTtemp[i][j][2] = out[indexFFT(i, j)][1];
            }
        }
谢谢你的考虑。 祝你一切顺利,
蓝色

此行中有一个错误:

FTtemp[i][j][2] = out[indexFFT(i, j)][1];
请注意,在代码的前面,FTtemp[i][j]被初始化为新的double[2],这意味着FTtemp[i][j][2]是一种越界写入

这里可能还有其他问题-也许IndexFlti,j给出了一个糟糕的索引但是如果没有看到out是如何初始化的,或者IndexFt是如何工作的,我们就不能确定了


希望这有帮助

FTtemp[i][j][2]是一种越界访问。你说得很对。不知道它是如何在调试模式下运行的,并且给出了好的结果。让我来测试一下。C++编码的有趣部分是,像这样的操作会导致不明确的行为,这意味着你不能对发生的事情做出许多假设。它可以在不发生碰撞的情况下正常工作,也可以发生碰撞,也可以没事但会在下游损坏某些东西。你就是不知道。你有没有考虑过使用像valgrind这样的工具?它非常适合识别越界读取和写入以及各种其他错误。@BlueMoon,因为您使用的是原始指针,即使在调试模式下,也没有对这些指针进行边界检查。您可能删除了溢出数据,这应该在释放内存时检测到。我不知道删除是什么意思,也不知道如何释放内存对不起,这里的非母语人士和新手^^^,但我现在明白了这是如何从我的注意力中溜走的。谢谢大家的快速帮助,并给出解释C++如何工作,以便我可以在未来注意!