私のコードの問題を解明するのに苦労しています...私はゲームのプロトタイプ作成の初期段階です(私の最初の深刻なプロジェクト)。頻繁に起こるとは限りませんが、セグメント違反でクラッシュします。ここでは、プログラムの流れだ...このセグメンテーションフォルトがどこで、どのように発生するのか、どうすればわかりますか?
- タイトル画面 - と衝突したときに、画面上の
- プレイヤーと敵の新しいゲームを開始するためのプレスZ ...敵は4人の命があり、人生を取ります。
- キャラクターの人生は0で、ゲームが戻ってタイトル画面に行く - クラッシュが発生した場所
ここにデバッグ情報と関連コードがあります...要求された場合、他のコード/情報を提供します。
*** 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
'background'を共有していますか? – user7116
いいえ...レベルとタイトルには、独自の背景用のポインタがあります。 – rzrscm
'title 'のコンストラクタで' loadImage'が呼び出されましたか?どうやって? – UmNyobe