これであなたもメモリリーク
某、サイトでエラーチェックを以下のように行っていた。
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:何回よばれるか分からない状態