2014-10-07 56 views
-4

Goodday所有, 我收到以下錯誤:如何解決在C++中「訪問違反讀取位置錯誤」?

First-chance exception at 0x67887AB7 (SDL2_mixer.dll) in Racing.exe: 0xC0000005: Access violation reading location 0xCCCCCCD4.

我想問題可能是與指針,但我沒有經歷過足夠++在C語言中找到它。 我希望有人可以告訴我我做錯了什麼,並希望我可以從中學習:)

試圖從我的gamebus調用它。

Music Mus; 
Mus.SpeelGeluid("crash"); 

音樂類

bool Music::LoadMusic(){ 
    //Load music 
    Mix_Music *gMusic = NULL; 
    gMusic = Mix_LoadMUS("MusicTest.wav"); 
    Mix_PlayMusic(gMusic, -1); 
    bool success = true; 
    if (gMusic == NULL) 
    { 
     printf("Failed to load Music background song! SDL_mixer Error: %s\n", Mix_GetError()); 
     success = false; 
    } 

    // Load sound effects 
    Mix_Chunk *gCrash = NULL; 
    gCrash = Mix_LoadWAV("Crash.wav"); 
    if (gCrash == NULL) 
    { 
     printf("Failed to load scratch sound effect! SDL_mixer Error: %s\n", Mix_GetError()); 
     success = false; 
    } 
    return success; 
} 

void Music::SpeelGeluid(string soundname){ 
cout << soundname << endl; 

if (soundname == "crash") 
{ 
    try 
    { 
     Mix_PlayChannel(-1, gCrash, 0); 
    } 
    catch (int e) 
    { 
     cout << "An exception occurred. Exception Nr. " << e << '\n'; 
    } 
} 
else 
{ 
} } 

謝謝您的時間

+1

是的,這可能是一個指針。但是,我們無法調試您的代碼。您需要在調試器中逐步完成它,或者使用打印語句來縮小問題的範圍。 – user3344003 2014-10-07 19:46:10

+1

您需要在'Mix_PlayMusic(gMusic,-1);'之前檢查'gMusic'是否爲'NULL'。 – molbdnilo 2014-10-07 19:48:31

回答

1

你有兩個主要問題:

首先,檢查它是否是NULL之前你使用gMusic
這可能會導致Mix_PlayMusic崩潰,實際上意味着編譯器可能會優化後面的NULL檢查。

其次,也很可能是您的問題的原因,您在LoadMusic中聲明瞭gCrashgMusic作爲局部變量。
從我的名字和gCrashSpeelGeluid的使用中,我的教育猜測是你也有兩個全局變量或者可能的成員變量,它們的名字相同,你可以用來存儲加載文件的結果。

您的本地變量隱藏這些全局變量,而您只修改本地變量。

刪除線

Mix_Music *gMusic = NULL; 

Mix_Chunk *gCrash = NULL; 

擺脫這些局部變量。

當您定義它們時,請將全局初始化爲NULL

+0

是不是由編譯器自動初始化全局變量,所以指針會得到一個空值分配...或者只是C? – Zammalad 2014-10-07 22:02:24

+0

@Zammalad是的,你是對的。我認爲。 – molbdnilo 2014-10-07 22:10:51

1

只要你分配他們檢查你的指針和適當地處理它們。你幾乎這樣做:

gMusic = Mix_LoadMUS("MusicTest.wav"); 
Mix_PlayMusic(gMusic, -1); // <- You're using the pointer here before you check it 
bool success = true; 
if (gMusic == NULL) // <- this needs to be immediately after assignment 

這只是從你指出的代碼。您也可能錯過了SDL2_mixer.dll的通用初始化調用。

調試它並逐行逐行,以便知道哪個位導致錯誤。