SDL_ConvertSurfaceについて注意

今回テクスチャの読み込みにはSDL_imageを使っている。対応しているフォーマットの画像ならばIMG_Load()一発で読み込めるという優れもの。透過色やα付きPNGにも対応。

ところで、WEB上のSDL_Imageでテクスチャを読み込むサンプルではこういうコードをよく見る。

  // 読み込み
SDL_Surface *image = IMG_Load ( "mudamuda.png" ); 
  // 32ビットRGBAフォーマットに変換するための空Surfaceを作成
SDL_Surface *tmpImage = SDL_CreateRGBSurface ( SDL_SWSURFACE, 0, 0, 32, rmask, gmask, bmask, amask );
  //イメージの変換
image = SDL_ConvertSurface ( image , tmpImage->format, SDL_SWSURFACE );
SDL_FreeSurface ( tmpImage ); 

読み込んだ画像をSDL_ConvertSurfaceで32ビットRGBAに変換しているんだけれど、変換元Surfaceとして変数imageを渡し、変換後Surfaceをそのままimageに代入してしまっている。これだと変換元Surfaceが開放されずにLeakしてしまうのでは?
それともSDL_ConvertSurface内で自動的に変換元を開放したりしてるのか?ということでSDLのソースを追って調べてみたけど、内部で変換元を解体するような処理はしていないようだった。
というわけで、SDL_ConvertSurfaceを使う場合はちゃんと変換元Surfaceを開放してあげたほうがよさそう。

SDL_Image* converted;
converted = SDL_ConvertSurface ( image, tmpImage->format, SDL_SWSURFACE );
if( converted != NULL ) {
    SDL_FreeSurface(image);
    image= converted;
}

いい加減なこと書いてたらごめんなさい。