1

(注:私はPascalでコーディングしています)

クラスの作成者では、TQuest次のようにパラメータとして指定されたpSDL_Surfaceを使用していくつかのオブジェクトを初期化します。

quests.Add( CPopuQuest.create('Get money ! ','Get more than $10,000', IMG_LOAD(MONEY_ICON), 1000, 10) ); (興味深い部分はIMG_LOAD(MONEY_ICON)、MONEY_ICONを使用した画像へのパスです。

プログラムを終了すると、次の行のこのCPopuQuestオブジェクトのデストラクタでエラーが発生します。

if badge<>nil then SDL_FreeSurface(badge)

(バッジは、IMG_LOAD(MONEY_ICON)によってインスタンス化されたpSDL_Surfaceがコピーされる属性です)

ほとんどの場合は機能しますが、プログラムを閉じるときにエラーが発生することがあります...誰かが助けてくれるなら:)(ご覧のとおり、IMG_LOADの動作、返される内容、および呼び出されたときにメモリがどのように割り当てられるか)。

4

2 に答える 2

1

nullポインタを返したとしても、返されるものIMG_Loadはすべて安全にに渡すことができます。(したがって、呼び出す前SDL_FreeSurfaceに確認する必要はありません。)badge <> nilSDL_FreeSurface(badge)

を呼び出したときにプログラムがクラッシュする場合は、プログラムSDL_FreeSurfaceの他の問題が原因です。その関数は、IMG_Loadロードされたものをすべて解放する正しい方法です。この質問に示されていることはすべて正しいです。

于 2012-04-17T22:15:19.077 に答える
0

メモリリークがある可能性があります。それは表面ではなく、別のコードからのものである可能性があります。一度、範囲外の配列にアクセスすると、サーフェスが変更され、パレットポイントがnullではない(nullである必要があります)という間違いを犯します。SDL_FreeSurfaceを呼び出すと、エラーが発生します。

于 2012-04-19T14:21:20.857 に答える