デストラクターでポインターを NULL に設定する
オブジェクト指向プログラミングでは、メモリを動的に割り当て、デストラクターを使用して解放するのが一般的です。 Bar 型のオブジェクトにメモリを割り当てる次のクラスを考えてみましょう:
<code class="cpp">class Foo { public: Foo() : bar(new Bar) { } ~Foo() { delete bar; } void doSomething() { bar->doSomething(); } private: Bar* bar; };</code>
デストラクターで bar ポインターを NULL に設定するのは有益ですか?
NULL への設定に対する反論
一般的な考えに反して、デストラクターでポインターを NULL に設定することは推奨されません。デバッグ目的では良いアイデアのように思えますが、リリース ビルドで隠れた問題が発生する可能性があります。
ポインターが NULL に設定されている場合、削除されたオブジェクトへのダングリング参照がどこかに存在する可能性があります。デバッグ ビルドでは、この参照が検出され、診断可能なクラッシュがトリガーされます。ただし、リリース ビルドでは、バグのあるコードはポインターが NULL であることに気づいてその使用を回避する可能性があり、その結果、根本的な問題がわかりにくくなります。
代替アプローチ
代わりにポインタを NULL に設定する場合は、既知の不正なポインタ値に設定することをお勧めします。こうすることで、削除されたオブジェクトへのダングリング参照は引き続きポインターの使用を試み、より簡単に診断して修正できるクラッシュを引き起こします。
たとえば、次のイディオムを使用できます:
<code class="cpp">~Foo() { delete bar; if (DEBUG) bar = (bar_type*)(long_ptr)(0xDEADBEEF); }</code>
このアプローチにより、リリース ビルドが未解決の参照を検出してクラッシュすることを保証しながら、潜在的なバグをデバッグ ビルドで捕捉できます。
結論
その間デストラクターでポインターを NULL に設定するのは良い考えのように思えるかもしれませんが、そうすることでリリース ビルドの潜在的な問題が隠れてしまう可能性があります。代わりに、診断とデバッグを容易にするために、デバッグ モードで既知の不正な値へのポインタを設定することをお勧めします。
以上がデストラクターではポインターを NULL に設定する必要がありますか?ベスト プラクティスとデバッグの概要。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。