[迷信] free に NULL を渡すとクラッシュする

まずは次のコードをご覧ください。

if (ptr != NULL)
{
  free(ptr);
}

上のコードを見て何の違和感も感じないようであれば、あなたは迷信にとらわれている可能性があります。論より証拠ですので、JIS X3010:2003の「7.20.3.2 free関数」から引用することにします。

機能 free関数は,ptrが指す領域を解放し,その後の割付けに使用できるようにする。ptrが空ポインタの場合,何もしない。

free の引数に空ポインタ(すなわち NULL)を渡した場合は何もしないことが明記されています。このことからも分かるように、free の引数が NULL であるかどうかの判別は無意味に冗長なだけです。

ただし、ライブラリのバグなどによって、NULL を渡すと本当に誤動作する環境も存在することでしょう。その場合には、NULL かどうかの判別を行っている箇所にはしかるべきコメントを書くべきです。あるいは、free 関数の内部で NULL かどうかの判別をさせると、排他制御が行われるなどの理由でオーバーヘッドが大きいので、外部で判別しているということもあるでしょう。その場合も理由のコメントが不可欠かと思います。

ちなみに、C++の delete 式はどうかというと、JIS X3014:2003の「5.3.5 delete式」によると...

いずれの形式であっても,deleteの演算対象がの値が空ポインタの場合,その演算の効果はない。

とあるため、free 関数と同じく NULL を渡しても問題ありません。なお、operator delete を再定義して、内部で空ポインタの判定を行っていない場合でも問題ありません。なぜなら、delete 式はメモリの解放に先立ってデストラクタを呼出さなければならないため、operator delete を呼出す前に空ポインタの判定を行っているからです。ただし、delete 式ではなく、operator delete を直接呼出す場合はこの限りではありません。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/496
このエントリーを含むはてなブックマーク