私の会社では、メモリを解放した後、変数を にリセットするというコーディング規則がありますNULL
。たとえば...
void some_func ()
{
int *nPtr;
nPtr = malloc (100);
free (nPtr);
nPtr = NULL;
return;
}
上記のコードのような場合、 に設定してもNULL
意味がないように感じます。それとも何か見落としているのでしょうか?
このようなケースでは意味がないのでしたら、このコーディングルールを削除するよう「品質チーム」に提案するつもりです。アドバイスをお願いします。
ベストアンサー1
未使用のポインタを NULL に設定するのは、ダングリング ポインタのバグを防ぐ防御的なスタイルです。解放された後にダングリング ポインタにアクセスすると、ランダムなメモリが読み取られたり上書きされたりする可能性があります。NULL ポインタにアクセスすると、ほとんどのシステムですぐにクラッシュが発生し、エラーの内容がすぐにわかります。
ローカル変数の場合、ポインタが解放された後にもうアクセスされないことが「明らか」であれば、少し意味がない可能性があります。そのため、このスタイルはメンバー データとグローバル変数に適しています。ローカル変数の場合でも、メモリが解放された後も関数が続行される場合は、良いアプローチになる可能性があります。
スタイルを完成させるには、実際のポインタ値が割り当てられる前に、ポインタを NULL に初期化する必要もあります。