何かのためにバッファを取り込む関数があり、関数のスコープ内のバッファにメモリを割り当てる必要があるとしましょう。次のようになります。
void func_with_buf( ...params..., char** buf ) {
if ( !buf ) {
buf = ( char** )calloc( ... );
}
/* more stuff here */
...
}
さて、この関数の後半には、falseと評価される別の条件ステートメントがあります。if/条件ステートメントでfalseが返された場合buf
は、関数自体でこれ以上何もできないため、ポインターからポインターを解放する必要があります。 。
したがって、これには2つのアプローチがあり、拡張性、再利用などの観点から、どちらが「より安全」でより実用的であると見なされるかを知りたいと思います。
アプローチA)
char* buf;
if ( !func_with_buf( ..., &buf ) ) {
free( buf );
buf = NULL;
/* more error handling here */
}
アプローチB)
char* buf;
if ( !func_with_buf( ..., &buf ) ) {
/* no need to free buf because func_with_buf handles deallocation internally. */
}
アプローチA)が推奨される方法であると何かが教えてくれますが、私は興味があり、何かを見落としたかどうかを確認したいと思います。
また、プログラマーがポインターからポインターを解放する必要がある場合、それを渡すだけで処理できるのと同じくらい簡単free(p)
ですか?または、同じタイプの単一のポインターにキャストする必要がありますか?
非常に多くの質問...