NULLポインタを削除しても安全ですか?
そして、それは良いコーディングスタイルですか?
NULLポインタを削除しても安全ですか?
そして、それは良いコーディングスタイルですか?
delete
とにかくチェックを実行するので、あなたの側でそれをチェックするとオーバーヘッドが追加され、見栄えが悪くなります。非常に良い方法は、後でポインタをNULLに設定することですdelete
(二重削除やその他の同様のメモリ破損の問題を回避するのに役立ちます)。
delete
また、デフォルトでパラメータをNULLに設定していた場合も気に入っています。
#define my_delete(x) {delete x; x = NULL;}
(私はRとLの値について知っていますが、それは素晴らしいことではないでしょうか?)
C++0xドラフト標準から。
$ 5.3.5 / 2-"[...]どちらの方法でも、deleteのオペランドの値はnullポインター値である可能性があります。[...'"
もちろん、NULL値を持つポインタの「削除」を行う人は誰もいませんが、安全に行うことができます。理想的には、NULLポインターを削除するコードを使用しないでください。ただし、ポインターの削除(コンテナーなど)がループで発生する場合に役立つことがあります。NULLポインタ値の削除は安全であるため、削除するNULLオペランドを明示的にチェックしなくても、実際に削除ロジックを記述できます。
余談ですが、C Standard $ 7.20.3.2は、NULLポインタの「free」はアクションを実行しないとも述べています。
free関数を使用すると、ptrが指すスペースの割り当てが解除されます。つまり、追加の割り当てに使用できるようになります。ptrがnullポインタの場合、アクションは発生しません。
はい、安全です。
nullポインタを削除しても害はありません。未割り当てのポインターがゼロに初期化されてから単純に削除された場合、関数の末尾でのテストの数が減ることがよくあります。
前の文が混乱を引き起こしたので、説明されていることの例(例外安全ではありません):
void somefunc(void)
{
SomeType *pst = 0;
AnotherType *pat = 0;
…
pst = new SomeType;
…
if (…)
{
pat = new AnotherType[10];
…
}
if (…)
{
…code using pat sometimes…
}
delete[] pat;
delete pst;
}
サンプルコードで選択できるあらゆる種類のニトがありますが、概念は(私は)明確です。ポインター変数はゼロに初期化されるためdelete
、関数の最後の操作では、ソースコードでnullでないかどうかをテストする必要はありません。ライブラリコードはとにかくそのチェックを実行します。
ヌルポインタを削除しても効果はありません。必要がないので必ずしも良いコーディングスタイルではありませんが、悪くはありません。
優れたコーディング手法を探している場合は、代わりにスマートポインターの使用を検討してください。そうすれば、まったく必要ありませんdelete
。
ruslikの答えを補足するために、C++14では次の構造を使用できます。
delete std::exchange(heapObject, nullptr);
削除演算子をオーバーロードしない限り、安全です。削除演算子をオーバーロードし、null条件を処理しない場合は、まったく安全ではありません。
この質問に答えるこの問題に関するFAQがあります。
C ++言語は、pがnullの場合、deletepが何もしないことを保証します。テストが逆方向に行われる可能性があり、ほとんどのテスト方法ではすべての分岐点を明示的にテストする必要があるため、冗長なifテストを実行しないでください。
NULL(つまり配列構文)を削除するのは安全ではない(VS2010)ことを経験しました。これがC++標準に準拠しているかどうかはわかりません。
NULL(スカラー構文)を削除しても安全です。