2013-05-02 51 views
0

我有一個惱人的訪問衝突問題與Visual Studio 2012年。我有同樣的問題,在Visual Studio 2010中,我認爲它可能是一個編譯器問題,但事實證明,它不是。文件*訪問衝突

這裏是給我的訪問衝突的部分代碼:

SDL_Surface *cGraphicsManager::LoadImageFromPak(char *filename, char *img_type) 
{ 
    // Load the 'file' to SDL_Surface 

    SDL_Surface *img = NULL;  
    char errorname[50]; 
    sprintf(errorname, "Unable to load image %s from pakfile", filename); 

    FILE *fin = pakfile.open_file(filename); 
    if(!fin) 
    { 
     ErrorLog(errorname); 
     return NULL; 
    } 

    SDL_RWops *rw; 
    rw = SDL_RWFromFP(fin, 1); 
    if (!rw) 
    { 
     ErrorLog("Erro na linha 213"); 
     return NULL; 
    } 

    img = IMG_LoadTyped_RW(rw,0, img_type); // it crashes on this line 
    if(img == NULL) 
     ErrorLog("Unable to load image from pakfile."); 
    SDL_FreeRW(rw); 
    //pakfile.close_mpk(); 
    //if (img_type == "PNG") 
    img = add_transparency(img); 
    return img; 
} 

它給了我在位置0x00000014訪問衝突寫。 奇怪的是它在MingW編譯器上編譯並運行良好,這讓我認爲它不是錯誤的代碼。 我讀了一些關於File *和Dll調用的問題,但我沒有找到如何解決這個問題。 我沒有鏈接警告,我已鏈接所有必要的庫。我也在調試模式下運行它並在多線程調試DLL(MDd)中編譯。 與MingW相比,Visual Studio編寫代碼要快得多,而且調試起來也比較容易,我會很感激任何迴應。 非常感謝。

+3

好吧,哪行代碼產生異常? – OldProgrammer 2013-05-02 16:49:19

+3

如果您實際使用C++而不是C來使用類,那麼您可能會遇到更少的麻煩。 – rubenvb 2013-05-02 16:51:05

+0

'img_type'在崩潰時的值是多少? – olevegard 2013-05-02 16:51:54

回答

2

地址正在告訴 - 代碼正在取消引用空指針來訪問對象地址中的0x14 (20)字節的成員。我會嗅探rw參數的內容。它可能不是null,但可能包含一個成員。我也會認真地推薦使用一個調試器,它會在崩潰時暫停,以便檢查調用堆棧。最後一個建議 - 如果您使用的是第三方庫,則可能需要某種初始化調用來設置全局狀態。不這樣做可能會導致崩潰(個人經驗)。

+0

感謝您提供所有反饋。根據要求,img_type在通話時間爲「PNG」。我也同意評論說我不應該混用C和C++代碼,但是從使用SDL_Rwops的包文件中讀取文件的唯一例子是它,它使用C代碼。另外,rw似乎確實被損壞了。編譯器告訴不能爲其成員加載sdl符號。我真的認爲這是一種初始化問題,因爲它在MingW編譯器上運行良好。感謝所有幫助傢伙! – 2013-05-03 00:08:42