2017-06-24 11 views
1

これはdouble free or corruptionというエラーを生成する短いコードです。"double free or corruption"エラー

SDL_Surface *surface; 
SDL_Surface *surface2; 
surface = NULL; 
surface2 = SDL_LoadBMP("someImg.bmp"); 
surface = surface2; 
SDL_FreeSurface(surface); 
SDL_FreeSurface(surface2); 

私が理解できない理由は、私が最初に解放する前に第2面を解放できない理由です。

答えて

7

変数surfacesurface2の両方が同じオブジェクトを指しています。あなたは効果的に同じオブジェクトを2倍解放しています。

+0

アドレスなしでコンテンツのみを割り当てる方法をご存知ですか? – Davey

+1

@Davey: 'SDL_Surface'オブジェクトを複製するためのSDL APIがあるかもしれません。また、ビットマップを2回ロードすることもできます。構造をコピーすることは、どちらもうまくいきません。 – chqrlie

+2

@Davey:あなたが割り当てたときに*コンテンツ*を一切コピーしません。 'SDL_Surface'はSDLライブラリの一種であり、内部構造体へのリンクを持っているので、自分でコピーすることはできませんが、' SDL_CreateRGBSurface() 'で新しいマッチングサーフェイスを作成し、' SDL_BlitSurface () 'を返します。 –

3

surface = surface2;ステートメントを実行すると、surfacesurface2ポインタの両方が同じメモリ領域を指していることになります。あなたがそれを解放したら、それは無料です。もう一度解放しようとすると(もう一方のポインタを介して)、すでに解放されているメモリを解放してこのエラーを引き起こします。

関連する問題