これであなたもメモリリーク

某、サイトでエラーチェックを以下のように行っていた。


void *ptr1 = malloc(size1);
void *ptr2 = malloc(size2);
if(NULL==ptr1 || NULL==ptr2){
return;
}

さて、どこがいけないのだろうか?
以下のような条件になったとしよう。

  • このソースがプログラム全体で何回も呼ばれる状態*1
  • ptr1が確保できて ptr2だけが確保できない場合

これにより、見事にptr1の方がメモリリークする。

これを解決するために私はgoogle:dkutil_cというライブラリでは
以下のような方式でコーディングしている。


void *ptr1 = malloc(size1);
void *ptr2;
if(NULL==ptr1){
return;
}
ptr2 = malloc(size2);
if(NULL==ptr2){
goto End;
}

//何かの処理をすると思ってください。

End:
//別に最後のptr1 = NULLは必要ないときはあるけど・・・。
if(ptr1){free(ptr1);ptr1=NULL;}
if(ptr2){free(ptr2);ptr2=NULL;}

*1:何回よばれるか分からない状態