2016-05-19 2 views
0

このコードはメモリをリークしますか?同じ変数へのポインタを返すとメモリがリークしますか?

SDL_Texture* texture; 
SDL_Surface* surface; 
int infinity = 99999999; 
for (int i=0; i<infinity; i++) { 
    surface = IMG_Load("path/to/image.png"); 
    texture = SDL_CreateTextureFromSurface(renderer, surface); 
} 

変数を再割り当てするたびに、サーフェスとテクスチャを破棄(メモリから消去)する必要がありますか? C++でメモリリークが発生する

+0

はい、あなたは 'NULL'ポインタチェックを行うことを覚えておいてください。 –

答えて

5

はい。 SDL_CreateTextureFromSurfaceは、対応するSDL_DestroyTextureおよびSDL_FreeSurfaceのメソッドを呼び出す必要があります。 SDL_CreateTextureFromSurface

表面用ページの

注変更またはこの機能によって解放されません。

@ bathshebaあたり、std::unique_ptrを使用して削除を行うことができます。

auto SDLTextureDeleter = [](SDL_Texture* pTexture) { if(pTexture) SDL_DestroyTexture(pTexture); }; 
std::unique_ptr<SDL_Texture, decltype(SDLTextureDelter)>(texture, SDLTextureDeleter); // This will call SDL_DestroyTexture when the unique pointer is destructed. 

は、ボーナスポイントのために、あなたはSDL_****ポインタを扱うnamespace stdstd::default_delete<T>のための特化を追加して、別々にデリータを宣言避けることができます。

+0

OPを 'std :: unique_ptr'に配線する方法(カスタムデリターを使って)をしたら、大量に* upvoteします。 – Bathsheba

+0

は、['IMG_Load'](https://www.libsdl.org/projects/SDL_image/docs/SDL_image_11.html#SEC11)のドキュメントに明示的に記載されています。「SDL_FreeSurfaceを返すことを忘れないでください。あなたはそれで終わりです。 " – jaggedSpire

+3

@ Bathshebaのコメントによれば、ごくわずかなコードで破壊を処理する 'std :: unique_ptr'を作成することができます。 'IMG_Load(" path/to/image.png ")、SDL_FreeSurface};' – jaggedSpire

1

のみ事はdelete[]でバランスが取れていないdeleteまたはnew[]とバランスがとれていないことであるnewです。 (あなたがmalloc & Cを使用している場合。また、その後、あなたはfreeを使用する必要があります。)

あなたのケースでは、それはIMG_LoadSDL_CreateTextureFromSurfaceのように見えるのではい、私はそれが漏れるんでしょうね、メモリを割り当てます。割り当てられたメモリのリリースをどのように管理する必要があるかについては、関数のドキュメントを参照してください。通常、ライブラリがメモリを割り当てた場合、ライブラリはメモリを解放する手段を提供します。これは、メモリ管理がC++ランタイムによって行われ、コンパイルによって異なることがあるためです。

+0

本当ではありません。メモリを割り当てる(そしてリークする)方法は他にもあります。例としては、UNIXでは 'brk()'/'sbrk()'、Windowsでは 'CoTaskMemAlloc()'、 'GlobalAlloc()'、 'HeapAlloc()'、 'LocalAlloc()'& 'VirtualAlloc()'があります。そしてさらに創造的になるならば。おそらくこれらはすべてプラットフォーム固有のものですが、割り当て/漏洩の他の方法があることを証明しています。 –

+0

標準C++(C++ APIを提供する任意のosとは対照的)の文脈では、私の答えは真です。 – Bathsheba

+0

はペダンティックであるとはいえ、あなたはまだプレースメントを忘れています... –

関連する問題