2011-10-21 9 views
1

SDL_Surfaceを使用して画像を処理すると、同じポインタでSDL_FreeSurface(SDL_Surface *)doc)を2回実行するとセグメンテーションフォルトが発生するという問題が発生します。SDL_FreeSurfaceの前にサーフェスが解放されているかどうかをチェック

私はそれがなぜ起こるのか理解していますが、私はそれを避ける方法を知る必要があります。私はポインタの状態を確認したいです(既存のサーフェスを指しているかどうか調べてください)。そして必要な場合にのみサーフェスを解放します。

どうすればいいですか?

+4

ポインタを最初に削除した後にNULLに設定することができます。しかし、優れたデザインでは、最初に2回削除する必要はありません。 RAII(http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)を参照してください。 – jrok

+0

@jrok:本当に、私は簡単な方法を探していたと思う。怠け者であることを私に恥ずべき。 :-P – Malabarba

答えて

4

SDL_Surfaceポインタをカプセル化してサーフェスをデストラクタに解放するクラスを作成します。また、コピーコンストラクターと代入演算子を適切に実装または無効にしてください。 (The rule of 3を参照してください)次に、SDL_Surfaceポインタで直接作業することはありません。

Here's an example of a wrapper around SDL that I was working on a while ago.

私はおよそSFMLを学んだ後、私は仕事を止めました。

+0

SDL_Surfaceポインタの問題点は、取得した関数に応じて、取得した全員を解放することになっていないことです。> _> 'SDL_SetVideoMode'例えば、解放されるべきでないポインタを返します。 – Xeo

+0

@ Xeo:はい、そのアイデアをカプセル化する必要があります。私がリンクしている例では、WindowクラスはSDL_SetVideoModeによって返されるサーフェスをカプセル化し、Surfaceクラスは他のすべてを処理します。どちらのクラスも抽象クラスDrawDestinationから派生しています。 –

+0

ゼオが言ったように、それはまさに私の問題です。私がこれを求めている理由は、私がサーフェスを扱うクラスを書くことを試みているという事実です。問題は、実行時にいくつかのサーフェスを再ロードする必要があることですが、(もちろん)再ロードする前にフリーズする必要があります。しかし、まだロードされていない場合、私はsegfaultを取得します。 – Malabarba

関連する問題