2012-04-27 2 views
3

私のコードの問題を解明するのに苦労しています...私はゲームのプロトタイプ作成の初期段階です(私の最初の深刻なプロジェクト)。頻繁に起こるとは限りませんが、セグメント違反でクラッシュします。ここでは、プログラムの流れだ...このセグメンテーションフォルトがどこで、どのように発生するのか、どうすればわかりますか?

  • タイトル画面 - と衝突したときに、画面上の
  • プレイヤーと敵の新しいゲームを開始するためのプレスZ ...敵は4人の命があり、人生を取ります。
  • キャラクターの人生は0で、ゲームが戻ってタイトル画面に行く - クラッシュが発生した場所

新しいゲームを開始するためのプレスzが最後のステップです...クラッシュが唯一のプレイヤーが死に、後に発生するようタイトル画面に戻り、プレイヤーはzを押して別のゲームを開始しますが、必ずしもクラッシュするとは限りません。 gdbによって、Deconstructorが呼び出されたときに起こることが判明しました...

ここにデバッグ情報と関連コードがあります...要求された場合、他のコード/情報を提供します。

*** 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 

だから、私は知っているが、それはレベルにTITLEから状態を変更だ際にクラッシュが発生することがある...ここでアンロードし、状態をロードするクラス機能だ... currentStateのはGameStateクラスのプライベートベクトルでありますそれは音楽や画像...最初の関数は1が、それは上のクラッシュされるどちらのものを解放するのかどうか...

std::vector<GameState *> currentState; 

void GameState::load(STATE loadState) { 
    if(state == TITLE) { 
     while(!currentState.empty()) { 
      delete currentState.back(); 
      currentState.pop_back(); 
     } 
     currentState.push_back(new Title()); 
    } 
    else if(state == LEVEL) { 
     while(!currentState.empty()) { 
      delete currentState.back(); 
      currentState.pop_back(); 
     } 
     currentState.push_back(new Level(currentLevel)); 
    } 
} 

タイトルクラスのデコンストラクタが呼び出されたときにクラッシュが起こる...それが起こります。

Title::~Title() { 
    SDL_FreeSurface(background); 
    Mix_FreeMusic(music); 
    background = NULL; 
    music = NULL; 
} 

ここでは画像の読み込み関数のコードだ...

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 
+0

'background'を共有していますか? – user7116

+0

いいえ...レベルとタイトルには、独自の背景用のポインタがあります。 – rzrscm

+0

'title 'のコンストラクタで' loadImage'が呼び出されましたか?どうやって? – UmNyobe

答えて

2
#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 

動的に割り当てられていないオブジェクトを解放しようとしている可能性があります。 backgroundはどのように彼の価値を得ていますか?

+0

それは私がチェックした最初のものでした...そして、私はNULLポインタが少なくとも明らかな方法で解放されている場所を見つけることができません。 – rzrscm

+0

私の編集を参照してください.... – UmNyobe

+1

おそらくバグは、プレイヤーが2つ以上の「Z」を連続して入力することによって引き起こされる可能性があります。あなたはまだ建設されていないものを破壊しようとしています。 –

関連する問題