この質問で述べたように、開発中の小さなゲームに SDL を使用しています。現在、SDL_DisplayFormatAlpha に問題があります。PNG 画像からアルファ チャネルを使用してサーフェスを作成しようとしています。以前は機能していましたが、少しリファクタリングを行ったところ、何かが壊れました。このコンストラクターに絞り込みました。
Surface::Surface( tfilename file ) {
    // initialize the surface data member to the image indicated by filename
    SDL_Surface *tempSurface;
    tempSurface = IMG_Load( file.c_str() );
    if ( !tempSurface ) {
        surface = NULL;
        exit(1);
    }
    else {
        surface = SDL_DisplayFormatAlpha( tempSurface );
        //surface = tempSurface;
    }
    SDL_FreeSurface( tempSurface );
}
これは問題なくコンパイルされますが、実行するとセグメンテーション エラーが発生します。gdb によって報告されたエラー:
プログラム受信信号 SIGSEGV、セグメンテーション違反。 [スレッド 0xb79c16c0 (LWP 8089) への切り替え] /usr/lib/libSDL-1.2.so.0 からの SDL_DisplayFormatAlpha () の 0xb7e8b9a3
スタック トレースは次のとおりです。
#0 0xb7e8b9a3 in SDL_DisplayFormatAlpha () from /usr/lib/libSDL-1.2.so.0
#1 Surface の 0x0804987e (this=0x804d060, file=@0xbfb20760) at Surface.cpp:16
#2 画像内の 0x0804a159 (this=0x804d038, x=0, y=0, file=@0xbfb207a0)
    Image.cpp:16 で
#3 オブジェクト内の 0x0804a3de (this=0x804d028, imageFile=@0xbfb207dc)
    Object.cpp:4 で
#4 アプリケーションの 0x080491cb (this=0xbfb20810)、Application.cpp:8
#5 main () の 0x08048e0d at main.cpp:5
コメントアウトしてsurface = SDL_DisplayFormatAlpha( tempSurface );  コメントSDL_FreeSurface( tempSurface );を外すと、surface = tempSurface;次のようになります。
Surface::Surface( tfilename file ) {
    // initialize the surface data member to the image indicated by filename
    SDL_Surface *tempSurface;
    tempSurface = IMG_Load( file.c_str() );
    if ( !tempSurface ) {
        surface = NULL;
        exit(1);
    }
    else {
        //surface = SDL_DisplayFormatAlpha( tempSurface );
        surface = tempSurface;
    }
    //SDL_FreeSurface( tempSurface );
}
それからそれはうまくいくようです。誰が何が起こっているのか教えてもらえますか? 実際、SDL_DisplayFormatAlpha をコメントアウトすると、透明度も機能するようです。その関数は、アルファ チャネルをまだ持っていない画像でのみ使用することを意図していますか?