1

OK-ここに面白いものがあります。私はテトリスクローンに取り組んでいます(基本的に私のスキルを「レベルアップ」するため)。コードをリファクタリングして、希望どおりに抽象化しようとしていました。以前は問題なく機能していましたが、画像がブリットされる前にセグメンテーション違反が発生しました。私はそれを無駄にデバッグしようとしました。

プロジェクトのSVN作業コピーをここに投稿しました。

これは単なる小さなプロジェクトであり、私よりも知識が豊富で優れたデバッガーがあれば、すぐに理解できるでしょう。唯一の依存関係はSDLです。私が間違っていることを教えてくれる人への称賛。

編集:私が知る限り、私が今持っているものと以前持っていたものは論理的に同じなので、私が今持っているものがセグメンテーション違反を引き起こすとは思わないでしょう。作業中のコピーでsvnrevertを実行し、再コンパイルするだけで、機能していることがわかります...

4

3 に答える 3

4

Surface.cpp の 15 ~ 18 行目を見てください。

    surface = SDL_DisplayFormatAlpha( tempSurface );
    surface = tempSurface;
}
SDL_FreeSurface( tempSurface );

後でこのサーフェスを使用すると、次の行のために tempSurface で実際に操作しているため、セグメンテーション違反であると思います。

surface = tempSurface;

SDL_DisplayFormatAlpha()によって返される面ではありません。tempSurface を解放したため、サーフェスは無効なメモリを指しています。修正するには、else ブロックの 2 行目を削除するだけです。

于 2008-12-04T19:55:13.447 に答える
0

私の知る限り、使用できなくなったポンターを操作しようとしたり、定数の値を変更しようとしたりすると、セグメンテーション違反が発生します。

于 2015-02-01T04:25:01.667 に答える
0

私のマシンにはSDLがインストールされていませんが、コードを調べた後です。

Output.cpp ファイルでこれに気付きました:

display = new Surface();

あなたは何もしません。このコンストラクタは空です。(サーフェスは初期化されていません)。

次に、Output::initialize() で次のようにします。

display->surface = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );

これは、Surface::surface が実際に初期化されなかった問題のようです。解決策が見つからない場合は、家に帰ったら調べてみます。

于 2008-12-04T16:53:21.630 に答える