こんにちは。
私は確保したメモリの解放し忘れを防ぐために使用します。
コード:
char *p1 = NULL; // グローバル
char *p2 = NULL;
int example() {
p1 = malloc( 512 ); // メモリ確保
if( NULL == p1 ) {
return -1; // エラー処理
}
p2 = malloc( 256 ); // メモリ確保
if( NULL == p2 ) {
free( p1 );
return -1; // エラー処理
}
if( -1 == func1() ) {
/// func1関数が失敗したら
goto error; // ラベル"error"に飛ぶ
}
if( -1 == func2() ) {
/// func2関数が失敗したら
goto error; // ラベル"error"に飛ぶ
}
return 0;
// ラベル "error"
error:
free( p1 ); // メモリを開放
free( p2 );
return -1; // -1を返す
}
こんな感じに関数内でなんらかの不具合が発生した際にgotoを使ってエラー処理をします。
これでメモリリークが発生しづらくなります。
ただC++が使えるならばスマートポインタを用いますし、Cしか使えなくても、もう少し工夫しますがw