オブジェクトに対して delete を呼び出す前に NULL をチェックするのは良い考えですか?
いいえ!
int *p = NULL;
delete p ; //no effect
標準は言う [セクション 5.3.5/2]
オペランドがクラス型の場合、前述の変換関数を呼び出すことによってオペランドがポインタ型に変換され、変換されたオペランドがこのセクションの残りの部分で元のオペランドの代わりに使用されます。いずれの場合も、delete のオペランドの値がヌル ポインターの場合、操作は無効になります。
さらにセクションでは18.4.1.1/13
void operator delete(void* ptr) throw();
void operator delete(void* ptr, const std::nothrow_t&) throw();
デフォルトの動作:
— ptr の null 値の場合、何もしません。
— ptr のその他の値は、デフォルト演算子 new への呼び出しによって以前に返された値であり、演算子 delete(void*) (17.4.3.7) への介入呼び出しによって無効にされませんでした。そのような ptr の非 null 値の場合、デフォルト演算子 new への以前の呼び出しによって割り当てられたストレージを再利用します。
編集:
ここでジェームス・カンゼは次のように述べています。
チェックするのは、オペレーターの削除 (または削除[]) の責任です。標準は、null ポインターが与えられないことを保証しません。標準では、null ポインターが指定された場合、ノーオペレーションである必要があります。または、実装がそれを呼び出すことが許可されていること。最新のドラフトによると、「割り当て解除関数に指定された最初の引数の値は null ポインター値である可能性があります。その場合、割り当て解除関数が標準ライブラリで提供されている場合、呼び出しは効果がありません。」「標準ライブラリで提供されるものである」という意味が何を意味するのかはよくわかりません---文字通りに解釈されます.彼の機能は標準ライブラリによって提供されるものではないため、文は適用されないようです. . でも、なんとなく、腑に落ちません。