C++ 我怎样才能找出这个分段错误发生的位置和原因?

C++ 我怎样才能找出这个分段错误发生的位置和原因?,c++,segmentation-fault,game-engine,C++,Segmentation Fault,Game Engine,我很难找出我的代码的问题…我正处于游戏原型的早期阶段(我的第一个严肃项目)。它经常(但并非总是)因分段错误而崩溃。下面是程序的流程 标题屏幕-按z键开始新游戏 玩家和敌人在屏幕上…敌人在碰撞时夺去一条生命,共有4条生命 当角色的生命为0时,游戏返回到标题屏幕-按z键开始新游戏 最后一步是崩溃发生的地方…崩溃似乎只发生在玩家死亡并被带回标题屏幕,玩家按下z键开始另一场游戏后,但它并不总是崩溃。通过gdb,我已经确定当标题的解构器被调用时会发生 这是调试信息和相关代码…如果需要,我将提供任何其他

我很难找出我的代码的问题…我正处于游戏原型的早期阶段(我的第一个严肃项目)。它经常(但并非总是)因分段错误而崩溃。下面是程序的流程

  • 标题屏幕-按z键开始新游戏
  • 玩家和敌人在屏幕上…敌人在碰撞时夺去一条生命,共有4条生命
  • 当角色的生命为0时,游戏返回到标题屏幕-按z键开始新游戏
最后一步是崩溃发生的地方…崩溃似乎只发生在玩家死亡并被带回标题屏幕,玩家按下z键开始另一场游戏后,但它并不总是崩溃。通过gdb,我已经确定当标题的解构器被调用时会发生

这是调试信息和相关代码…如果需要,我将提供任何其他代码/信息

*** glibc detected *** /home/rzrscm/code/demogamething/game: free(): invalid pointer: 0x080c6b98 ***

//memory map info omitted

0xb7c54537 in raise () from /lib/libc.so.6
(gdb) where
#0  0xb7c54537 in raise () from /lib/libc.so.6
#1  0xb7c57922 in abort () from /lib/libc.so.6
#2  0xb7c8afbd in ?? () from /lib/libc.so.6
#3  0xb7c950ca in ?? () from /lib/libc.so.6
#4  0xb7c96918 in ?? () from /lib/libc.so.6
#5  0xb7c99a5d in free () from /lib/libc.so.6
#6  0xb7f4e776 in SDL_FreeSurface () from /usr/lib/libSDL-1.2.so.0
#7  0x0804ac7f in ~Title (this=0x80b4250, __in_chrg=<value optimized out>) at title.cpp:13
#8  0x08049d3a in GameState::load (this=0x804e368, loadState=LEVEL) at gamestate.cpp:39
#9  0x08049c5c in GameState::change (this=0x804e368, changeTo=LEVEL) at gamestate.cpp:26
#10 0x08049753 in Player::handleEvent (this=0x804e300) at player.cpp:102
#11 0x080490c8 in main () at main.cpp:27
这是图像加载函数的代码

SDL_Surface *loadImage(std::string imageFile) { 
    SDL_Surface *loadedImage;
    SDL_Surface *newImage; 

    loadedImage = IMG_Load(imageFile.c_str()); 
    newImage = SDL_DisplayFormatAlpha(loadedImage); 

    SDL_FreeSurface(loadedImage); 

    return newImage; 
}

[编辑]我在调试程序中又运行了几次,没有对代码进行任何更改,因为我仍然找不到问题所在…每次尝试释放音乐时发生崩溃

0xb7c54537 in raise () from /lib/libc.so.6
(gdb) backtrace
#0  0xb7c54537 in raise () from /lib/libc.so.6
#1  0xb7c57922 in abort () from /lib/libc.so.6
#2  0xb7c8afbd in ?? () from /lib/libc.so.6
#3  0xb7c950ca in ?? () from /lib/libc.so.6
#4  0xb7c9633e in ?? () from /lib/libc.so.6
#5  0xb79974e2 in ?? () from /usr/lib/libmikmod.so.2
#6  0xb7997640 in Player_Free () from /usr/lib/libmikmod.so.2
#7  0xb7ebb6e3 in Mix_FreeMusic () from /usr/lib/libSDL_mixer-1.2.so.0
#8  0x0804ac8d in ~Title (this=0x80c6bc0, __in_chrg=<value optimized out>) at title.cpp:14
#9  0x08049d3a in GameState::load (this=0x804e368, loadState=LEVEL) at gamestate.cpp:39
#10 0x08049c5c in GameState::change (this=0x804e368, changeTo=LEVEL) at gamestate.cpp:26
#11 0x08049753 in Player::handleEvent (this=0x804e300) at player.cpp:102
#12 0x080490c8 in main () at main.cpp:27
/lib/libc.so.6中的raise()中的0xb7c54537 (gdb)回溯 #在/lib/libc.so.6的raise()中0 0xb7c54537 #1 0xb7c57922位于/lib/libc.so.6的abort()中 #2 0xb7c8afbd英寸??()来自/lib/libc.so.6 #3 0xb7c950ca英寸??()来自/lib/libc.so.6 #4 0xb7c9633e英寸??()来自/lib/libc.so.6 #5 0xb79974e2英寸??()来自/usr/lib/libmikmod.so.2 #在/usr/lib/libmikmod.so.2的Player_Free()中的6 0xb7997640 #来自/usr/lib/libSDL\u mixer-1.2.so.0的Mix_FreeMusic()中的7 0xb7ebb6e3 #标题处的8 0x0804ac8d in~Title(this=0x80c6bc0,uuu in_uchrg=)cpp:14 #9游戏状态中的0x08049d3a::在游戏状态下加载(this=0x804e368,loadState=LEVEL)。cpp:39 #10 0x08049c5c处于游戏状态::在游戏状态下更改(this=0x804e368,changeTo=LEVEL)。cpp:26 #播放器中的11 0x08049753::handleEvent(此=0x804e300)位于播放器处。cpp:102 #main.cpp:27处的main()中的12 0x080490c8 您可能正在释放一个无效的指针。现在我读了

free(): invalid pointer: 0x080c6b98 

您可能试图释放未动态分配的对象。
background
如何获得他的值?

这是我检查的第一件事……我找不到任何空指针被释放的地方,至少不是以明显的方式。玩家快速连续输入两个或多个“Z”可能会触发该错误。因此,您正试图破坏一些尚未构建的内容;在Title的构造函数中…@James Anderson我测试了z理论,但这不是问题所在。不…Level和Title有自己的私有指针作为背景。
loadImage
Title
的构造函数中调用?如何?背景=加载图像(“bg.png”);你试过valgrind吗?没有…我只是在用gdb…如果有用的话,我会试试valgrind。
0xb7c54537 in raise () from /lib/libc.so.6
(gdb) backtrace
#0  0xb7c54537 in raise () from /lib/libc.so.6
#1  0xb7c57922 in abort () from /lib/libc.so.6
#2  0xb7c8afbd in ?? () from /lib/libc.so.6
#3  0xb7c950ca in ?? () from /lib/libc.so.6
#4  0xb7c9633e in ?? () from /lib/libc.so.6
#5  0xb79974e2 in ?? () from /usr/lib/libmikmod.so.2
#6  0xb7997640 in Player_Free () from /usr/lib/libmikmod.so.2
#7  0xb7ebb6e3 in Mix_FreeMusic () from /usr/lib/libSDL_mixer-1.2.so.0
#8  0x0804ac8d in ~Title (this=0x80c6bc0, __in_chrg=<value optimized out>) at title.cpp:14
#9  0x08049d3a in GameState::load (this=0x804e368, loadState=LEVEL) at gamestate.cpp:39
#10 0x08049c5c in GameState::change (this=0x804e368, changeTo=LEVEL) at gamestate.cpp:26
#11 0x08049753 in Player::handleEvent (this=0x804e300) at player.cpp:102
#12 0x080490c8 in main () at main.cpp:27
#5  0xb7c99a5d in free () from /lib/libc.so.6
#6  0xb7f4e776 in SDL_FreeSurface () from /usr/lib/libSDL-1.2.so.
free(): invalid pointer: 0x080c6b98