-2

現在、ゲーム プロジェクトで使用する TextureManager クラスをテストしていますが、2D テクスチャを std::map にロードしようとすると .exe がクラッシュするという問題があります。私が必要としているのは、標準の文字列でキー付けされた SDL_Textures へのポインタのマップがあることです

std::map<std::string, SDL_Texture*>Textures; 

SDL と SDL_image は正常に初期化されますが (コンソールで printfs が成功)、load() 関数が呼び出されるとすぐにテクスチャ マッピングが開始され、プログラムがクラッシュします。関数の実装の下

void TextureManager::load( std::string path, std::string id )
{
    SDL_Surface* TempSurface = IMG_Load( path.c_str() );
    if( TempSurface == NULL )
    {
        printf( "Failed to load %s: error: %s\n", path.c_str(), IMG_GetError() );
    }

    /* add color coding if necessary here
    SDL_SetColorKey( TempSurface, SDL_TRUE, SDL_MapRGB( TempSurface->format, 0, 0xFF, 0xFF ) );
    */

    SDL_Texture* newTexture = SDL_CreateTextureFromSurface( renderer, TempSurface );
    if( newTexture == NULL )
    {
        printf( "Failed to create a texture %s: error: %s\n", id.c_str(), SDL_GetError() );
    }

    SDL_FreeSurface( TempSurface );

    Textures[ id ] = newTexture;

    printf( "Texture %s mapped successfully", id.c_str() );

    //possible error - not the cause of the described error
    //SDL_DestroyTexture( newTexture );

}

当然、テクスチャ マップは TextureManager クラスのプライベート メンバーです。関数が TextureManager のコンストラクターによって呼び出されるか、後で TextureManager へのポインターによって呼び出されるかは問題ではありません - 同じ結果です。このローダーの以前のバージョンは、テクスチャをマッピングしていませんでした。マップはまったく使用されていませんでしたが、問題なく動作していました。地図が原因ですか?バージョンの違いはこれだけ…

編集:最後のコード行に追加のコメントを追加して「コメントアウト」しました。提案をテストした後、それがエラーの理由であり、プログラムの動作は変わらなかったので、他の方法で行う必要があります。

EDIT2: OK、問題を解決しました。サーフェスの 1 つが .jpg ファイルから読み込まれ、何らかの理由で jpg sdl ライブラリ ファイルが破損していました。そのため、JPG サポートは実行時に初期化されず、jpg ファイルをロードしようとすると exe がクラッシュしていました。プロジェクト フォルダー内の .dll を置き換えると、問題が解決しました。現在、すべてが期待どおりに機能しています。

4

1 に答える 1

0
Textures[id] = newTexture;
SDL_DestroyTexture(newTexture);

map<std::string, SDL_Texture*>これにより、 (または使用している同様のデータ構造)内で解放されたテクスチャへのポインタが残ります。テクスチャをロードした直後ではなく、不要になったときにのみテクスチャを破棄する必要があります。

破棄すると無効になる有効なインスタンスにSDL_CreateTextureFromSurfaceアドレスを返し、割り当てられなくなったアドレスを指すため、ダングリングポインターです。SDL_TextureTextures[id]

于 2015-06-06T21:20:36.053 に答える