如何解决"访问违规读取位置错误#34;在c ++中?

时间:2014-10-07 19:41:22

标签: c++ sdl-2

总之,所有的, 我收到以下错误:

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

我认为问题可能在于指针,但我在c ++中没有足够的经验来找到它。 我希望有人可以告诉我我做错了什么,希望我可以从中学到:)

尝试从我的游戏总线中调用它。

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
{
}   }

感谢您的时间

2 个答案:

答案 0 :(得分: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的通用初始化调用。

进行调试并逐行执行,以便知道哪个位导致错误。

答案 1 :(得分:1)

您有两个主要问题:

首先,您在检查gMusic之前是否使用NULL 这可能会导致Mix_PlayMusic崩溃,实际上意味着编译器可能会优化后期的NULL检查。

其次,很可能是您的问题的原因,您在gCrash中将gMusicLoadMusic声明为局部变量。
从名称和gCrash SpeelGeluid中的使用情况来看,我的猜测是你还有两个全局变量,或者可能是成员变量,它们具有你意图存储加载文件的结果。

您的局部变量隐藏了这些全局变量,而您只是修改局部变量。

删除行

Mix_Music *gMusic = NULL;

Mix_Chunk *gCrash = NULL;

去除这些局部变量。

在定义全局变量时,请将其初始化为NULL