3

コードの問題を理解するのに苦労しています...ゲームのプロトタイピングの初期段階にあります(私の最初の深刻なプロジェクト)。常にではありませんが、頻繁にセグメンテーション違反でクラッシュします。プログラムの流れは次のとおりです...

  • タイトル画面-zを押して新しいゲームを開始します
  • 画面上のプレイヤーと敵...敵が衝突すると命を奪う、4つの命があります。
  • キャラクターのライフが0の場合、ゲームはタイトル画面に戻ります-zを押して新しいゲームを開始します

最後のステップはクラッシュが発生する場所です...クラッシュは、プレーヤーが死亡してタイトル画面に戻り、プレーヤーがzを押して別のゲームを開始した後にのみ発生するようですが、常にクラッシュするとは限りません。gdbを通じて、Titleのデコンストラクターが呼び出されたときに発生することを確認しました...

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

*** 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からLEVELに変更するとクラッシュが発生することがわかっています...状態をアンロードおよびロードするクラス関数は次のとおりです...currentStateはGameStateクラスのプライベートベクトルです...

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::~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
4

1 に答える 1

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に彼の価値を得るのですか?

于 2012-04-27T08:33:11.567 に答える