一点点背景,我对Java更有经验,并且有一些C / C ++经验 我正在使用Visual Studios 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 Studios项目时设置错误(即使我没有改变任何东西,因为它工作),或者我在标题中错误地分配了内存。我想到的另一个问题是每个图像大约是20MB,所以我可能会搞乱堆。 我非常感谢任何帮助。
正在读入的图像通常为10-20MB。代码编译为32位二进制文件。
这是导致崩溃的代码的相关简化部分。
#define TESTNUM 80
//A simple test main.
int main() {
ComplexImageFFTW a;
ComplexImageFFTW b[TESTNUM];
ComplexImageFFTW* ptrB;
ptrB = b;
printf("start\n");
a.readImage("imagefile1", true);
printf("Mission\n");
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
答案 0 :(得分:2)
Access violation writing location 0x00000000
表示您正在尝试写入内存位置0x00000000
,即您正在写入空指针。我认为指针p
的值可能为0.
您可能忘记拨打Registration::setUpRegistration
方法?
答案 1 :(得分:1)
阅读80多张图片后。堆的使用量> 1.7GB。由于这是编译为32位二进制文件,因此存在大约2GB的内存限制。当程序去计划傅里叶变换时,它导致内存分配失败,从而创建一个空指针。然后程序开始使用未选中的指针,导致访问冲突错误。