まずは次のコードをご覧ください。
0 1 2 3 4 5 |
if (ptr != NULL) { free(ptr); } |
上のコードを見て何の違和感も感じないようであれば、あなたは迷信にとらわれている可能性があります。論より証拠ですので、JIS X3010:2003の「7.20.3.2 free関数」から引用することにします。
機能 free関数は,ptrが指す領域を解放し,その後の割付けに使用できるようにする。ptrが空ポインタの場合,何もしない。
freeの引数に空ポインタを渡した場合は何もしないことが明記されています。このことからも分かるように、freeの引数が空ポインタであるかどうかの判別は無意味に冗長なだけです。ちなみにNULLというのは空ポインタ定数に展開されるマクロですね。C++の場合はnullptrでも同じです。
ただし、ライブラリのバグなどによっては空ポインタを渡すと本当に誤動作する環境も存在することでしょう。その場合には、空ポインタかどうかの判別を行っている箇所にはしかるべきコメントを書くべきです。あるいは、free関数の内部で空ポインタかどうかの判別をさせると、排他制御が行われるなどの理由でオーバーヘッドが大きいので、外部で判別しているということもあるでしょう。その場合も理由のコメントが不可欠かと思います。
ちなみに、よく似たものとしてC++のdelete式はどうかというと、JIS X3014:2003の「5.3.5 delete式」によると……
いずれの形式であっても,deleteの演算対象の値が空ポインタの場合,その演算の効果はない。
とあるため、free関数と同じく空ポインタを渡しても問題ありません。なお、operator deleteを再定義して、内部で空ポインタの判定を行っていない場合でも問題ありません。なぜなら、delete式はメモリの解放に先立ってデストラクタを呼出さなければならないため、operator deleteを呼出す前に空ポインタの判定を行っているからです。ただし、delete 式ではなくoperator deleteを直接呼出す場合はこの限りではありません。