2009-06-06 6 views
0

SDL_Mixerのこの機能は絶えず死にかけています。誰にもアイデアはありますか? Visual Studioによると、クラッシュはWindowsがrealloc()行のどこかでブレークポイントを起動することによって引き起こされます。以前に安定した機能でreallocがクラッシュする

SVNバージョンのSDL_Mixerのコードは、特に違いがある場合は該当します。

static void add_music_decoder(const char *decoder) 
{ 
    void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **)); 
    if (ptr == NULL) { 
    return; /* oh well, go on without it. */ 
    } 
    music_decoders = (const char **) ptr; 
    music_decoders[num_decoders++] = decoder; 
} 

、私は、Visual Studio 2008を使用している、とmusic_decodersとnum_decodersの両方が正しい(music_decodersは、ptrが0x00000000のである。文字列 "WAVE"、およびmusic_decodersに、1つのポインタが含まれている、と私は言うことができる最高クラッシュはrealloc()関数内にあるようですが、このクラッシュの問題をどのように処理できるか考えている人はいますか?

+0

デバッグモードでビルドしていますか?もしそうなら、あなたはここでもっと多くの細部を得ることができます。正確にどこがクラッシュしていますか?ブレークポイントを起動するのはなぜですか? (Windowsは通常あなたにその理由を伝えます)など。 – arke

+0

デバッグモードでビルドし、SDL_Mixer.DLLファイルとそれを使用しているプログラムに生成された* .pdbファイルをコピーし、そのプログラムをビルド/デバッグモードで実行します。クラッシュすると、上記のクラッシュが発生していますエリア。 – Sukasa

+0

これはC++でタグ付けされていますが、SDLプロジェクトはC言語で書かれています。C++では、おそらくstd :: vectorを使用して、間違ってしまう機会を避けることができます... –

答えて

5

ただし、num_decodersポインタの配列を割り当ててから、その配列のインデックスnum_decodersに書き込むことはできません。この関数が呼び出されたのはおそらく、0バイトが割り当てられ、結果へのポインタが書き込まれたと考えられます。これにより、メモリアロケータの構造が破損し、reallocが呼び出されたときにクラッシュ/ブレークポイントが発生する可能性があります。

Btw、あなたがバグを報告した場合、同じ方法で(mixer.c内の)add_chunk_decoderが壊れていることに注意してください。

Iは

void *ptr = realloc(music_decoders, (num_decoders + 1) * sizeof(*music_decoders)); 
0

ああ、Cのプログラミングの楽しさrealloc(またはmallocまたはfree)のクラッシュは、メモリブロックの境界を越えて書き込むことによって引き起こされる可能性があります。過去に使われたのは012の風味ですパッケージ。サードパーティのソリューションにジャンプする前に、Visual Studioがこれらの行に何かを提供しているかどうかを確認してください。

2

SDL_Mixer.DLLファイルとプログラムビルドが同じCランタイム設定を使用していることを確認してください。メモリは1つのCRTを使用して割り当てられ、別のCRTを使用して再割り当てされる可能性があります。

プロジェクト設定で、C/C++ - >コード生成を探します。ランタイムライブラリの設定は、両方で同じにする必要があります。

0

一般に、クラッシュはブレークポイントによってトリガされません。ブレークポイントやブレークポイントの処理中にクラッシュすることでクラッシュするのですか?

デバッグ出力ウィンドウには、CRTブレークポイントがヒットしている理由に関する情報が必要です。たとえば、メモリ操作中に、元のブロックの周囲のガードバイトが変更されたことが通知されることがあります(add_music_decoderが呼び出される前にバッファオーバーランが発生したため)。 CRTは、メモリが解放されたときや、再割り当てされたときに、これらのガードページをチェックします。

+0

エラーポップアップは間違いなくWindows起動ブレークポイントであると言いました。 – Sukasa

1

music_decoders [num_decoders ++] =デコーダと

void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **)); 

を交換したいです。

あなたはここにいます。 num_decodersが配列のサイズの場合、最後のインデックスはnum_decoders - 1です。したがって、次のように行を置き換える必要があります。

music_decoders [num_decoders-1] = decoder;

そして、関数の先頭でnum_decodersをインクリメントしたいのではなく、新しいサイズを頼りにしたいので、最後にnum_decodersをインクリメントしたいかもしれません。

もう1つ:sizeof(const char *)でサイズを掛けたい。ダブルスターではない。

+0

"関数の先頭にnum_decodersをインクリメントする" - もしそうであれば、失敗の場合に元に戻すことを忘れないでください。 –

関連する問題