总之,所有的, 我收到以下错误:
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
{
} }
感谢您的时间
答案 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
中将gMusic
和LoadMusic
声明为局部变量。
从名称和gCrash
SpeelGeluid
中的使用情况来看,我的猜测是你还有两个全局变量,或者可能是成员变量,它们具有你意图存储加载文件的结果。
您的局部变量隐藏了这些全局变量,而您只是修改局部变量。
删除行
Mix_Music *gMusic = NULL;
和
Mix_Chunk *gCrash = NULL;
去除这些局部变量。
在定义全局变量时,请将其初始化为NULL
。