2011-07-11 42 views
1

一點背景,我對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 
+2

爲什麼不在發佈之前減少此代碼? – Beta

+1

你能提供一個仍然崩潰的*最小*代碼示例嗎? –

+1

檢查你的指針。至少有一個是NULL,它不應該在那裏。 –

回答

2

Access violation writing location 0x00000000意味着你要寫入內存位置0x00000000,即你正在寫一個空指針。我認爲指針p的值可能爲0.

可能忘記打電話給Registration::setUpRegistration方法了嗎?

+0

讓我把它清理一下,直到我把它放在這裏,我才意識到它看起來有多瘋狂。在這一點上課程註冊並沒有被使用。至於p,它可能爲空,我將它分配到Register中,'fftwf_plan p [NUMTHREADS];' – dashosalt

1

閱讀後,80 +圖像。堆使用量> 1.7GB。由於這是作爲一個32位二進制文​​件編譯的,因此內存限制約爲2GB。當程序開始計劃傅里葉變換時,會導致內存分配失敗,從而創建空指針。然後程序去使用指針,取消選中,導致訪問衝突錯誤。