傅立叶变换规划中的访问冲突

Access Violation during planning of Fourier Transform

本文关键字:访问冲突 规划 变换 傅立叶      更新时间:2023-10-16

一点背景,我对Java更有经验,并且有一些C/c++经验。
我用的是Visual studio 2010。

我在头文件中创建了两个类,并给了它们字段。
它可以编译,并且在很长一段时间内运行良好。
我将整个项目目录复制到一个新文件夹(所有文件都在里面),然后简单地重新编译并运行它。现在,每当我运行它时,我都会得到"在RegistrationExpLib2.exe中的0x637779ab处未处理的异常:0xC0000005:访问违规写入位置0x00000000。"在这一行

FourierTrans[i] = fftwf_plan_dft_2d(imgRows, imgCols, in[i], out[i], FFTW_FORWARD, FFTW_MEASURE);

我检查了调试器,所有返回的类字段都不能计算表达式。
我已经检查过了,图像被正确地读取了。据我所知,所有的内存都被正确分配了。fftw3是我链接的一个C dll。
所以我真的很困惑,希望有人能指出一个可能的问题。我认为它要么,我做了一些错误的设置当我复制Visual studio项目(即使我没有改变任何东西,因为它是工作),或者我在头错误地分配内存。我想到的另一个问题是每个图像大约有20MB,所以我可能会弄乱堆。我真的很感激你的帮助。

每个读取的图像通常为10-20MB。该代码被编译为32位二进制。

这是导致崩溃的代码的相关简化部分。

#define TESTNUM 80
//A simple test main.
int main() {
   ComplexImageFFTW a;
   ComplexImageFFTW b[TESTNUM];
   ComplexImageFFTW* ptrB;
   ptrB = b;
   printf("startn");
   a.readImage("imagefile1", true);
   printf("Missionn");
   for(int i = 0; i < TESTNUM; i++) {
          b[i].readImage("imagefile2", true);
   } 
   //Crash occurs here.
   FourierTrans[i] = fftwf_plan_dft_2d(imgRows, imgCols, in[i], out[i], FFTW_FORWARD, FFTW_MEASURE);
         ...
} //End main

Access violation writing location 0x00000000表示您正在尝试写入内存位置0x00000000,即您正在写入空指针。我认为指针p的值可能是0。

可能你忘记调用你的Registration::setUpRegistration方法?

在阅读了80多张图片后。Heap的使用量大于1.7GB。由于这是作为32位二进制编译的,因此内存限制约为2GB。当程序开始规划傅里叶变换时,会导致内存分配失败,从而创建一个空指针。然后程序在未检查的情况下使用指针,导致访问冲突错误。