4

基本的に、プログラムが終了するまで存在するサーフェスでは、SDL_FreeSurface()それぞれに対して実行する必要がありますか、それともSDL_Quit()すべてを処理する必要がありますか?

私が質問する主な理由は、多数のサーフェスへのポインターがクラス メンバーであるためですSDL_FreeSurface()。そのため、それぞれのサーフェスで実行する場合は、各クラス インスタンスを (グローバル配列などで) 追跡する必要があります。もし SDL_Quit() が一挙にそれをやってくれるなら、私はむしろそれを使いたいです:D

4

3 に答える 3

2

SDL を使用してからしばらく経ちましたが、SDL_Quit が画面の表面 (最初に設定したメインの画面バッファー) をクリーンアップしていると確信しています。手動で作成した他のサーフェスを解放する必要があります。そうしないと、リークが発生します。もちろん、それらは既にクラス メンバーであるため、これを簡単に行う 1 つの方法は、クラス デストラクタでそれらを解放することです。

于 2010-06-23T06:10:49.143 に答える
1

SDL_FreeSurface() で使用していることがわかっているすべてのサーフェスをクリアすることをお勧めします。

同様に、すべて malloc を呼び出してヒープ領域を占有するポインタの配列を作成した場合、プログラムを終了しても、すべてのシステムで使用されている領域がすべてクリアされるわけではありません。

int **memspots[1024];
for (i = 0; i < 1024; i++) {
  memspots[i] = malloc(1 * sizeof(int *)); // 1024 pointers to ints stored in heap memory
}

アプリケーションの最後に、同様の方法で無料で電話をかけたいと思うでしょう。

for (i = 0; i < 1024; i++) {
  free(memspots[i]);
}

実行時であろうと終了時であろうと、可能な限りいつでも使用されているメモリを解放することは、ベスト プラクティスにすぎません。

SDL の GL テクスチャ関数は一時的に SDL_Surface を使用して (SDL_image から取得した) 画像データを収集し、最後に次のようにします。

  if (surface != NULL) // Will be NULL if everything failed and SOMEHOW managed to get here
    SDL_FreeSurface();

  return;
于 2010-06-23T10:22:49.477 に答える