NULL

2011-02-13 4 views
3

可能性の重複:
Is it worth setting pointers to NULL in a destructor?NULL

はデストラクタでNULLに(ヒープメモリを割り当て)のポインタを設定することが無意味ですか?

class SampleClass 
{ 
    public: 
     SampleClass(int Init = 0) 
     { 
      Value = new int(Init); 
     } 

     ~SampleClass(void) 
     { 
      delete Value; 
      Value = NULL; // Is this pointless? 
     } 

     int *Value; 
}; 

クラスのテーマについては、explicitというキーワードはいつ使用しますか?

+0

[デストラクタでNULLへのポインタを設定する価値はありますか?](http://stackoverflow.com/questions/3060006/is-it-worth-setting-pointers-to-null-in-a-デストラクタ)[I **はこれをしないでください、大胆に語るマイケルバリの答え、と100%同意するものとします。**] –

+0

explicit' 'の使用はで説明されている[「C++での明示的なキーワードが何を意味するのでしょうか?」] (http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean)が同様にリンクジェームズ:) –

+0

おかげで、設定しないことをお勧めすることはできませんそのポインタをNULLにします。もし 'delete'が同じポインタに対して再度呼び出されたならば、呼び出しを無視することで"うまく動作 "し、コードに隠れたバグがあることはわかりません。 – DeadCapacitor

答えて

1

NULLへのポインタを設定することをお勧めします。

SampleClassインスタンスを削除してから、同じインスタンスへの別のポインタを使用して値にアクセスすると、プログラムがNULL逆参照でクラッシュするため、何かが間違っていることがわかります(したがって、削除されたオブジェクトにアクセスしています)。

そうしないと、削除されたオブジェクトを使用して保つことができると(メモリが別のオブジェクトによって上書きされたとき)だけずっと後のバグに気づきます。このような問題はしばしばデバッグするのが非常に困難です。

+2

ため –

+0

@DavidRodríguez - dribeasルールできるだけ早くバグを明らかにすることです=プログラムの逆参照時にクラッシュするNULL値。 –

+0

@DavidRodríguez、これに対してアサーションまたは例外を使用することをお勧めします。 – whyleee

1

それは本当に無意味ではありません。理論的には、値は決して再びアクセスすることはできませんが、NULLに設定することは、他のすべてのシナジーが起こり始めると、将来あなたを助けるかもしれません。

+1

助けがあれば、アイキャッチャーの値に設定することが助けになるほど、ほとんど確実に助けにはなりません。 –

+0

Nah、特に、私は手動でこれを設定します。それは同じではありません。 – Puppy

+1

値 '0xDEADBEEF'は同じことを行います。さらに、「これを設定し、それが戻ってこないことを願って」という追加の意味を伝えます。 – MSalters

5

はい。オブジェクトは破壊されているので、無意味です。 破壊されると、ポインタに到達する方法がありません。

+0

しかし、オブジェクトのメモリは消去されません。また、SampleClassオブジェクトインスタンスへの別のポインタがある場合(誤って)、メモリにアクセスできます。 –

+3

@mzabskyもしあなたがその問題を抱えているのであれば、よりスマートなポインタを使うほうが良いので、オブジェクトは時期尚早に削除されません。残りのプログラムのバグに対して防御しようとするのはかなり無意味です。 –

4

はい、デストラクターの最後でポインタをNULLに設定しても意味がありません。デストラクタから離れるとすぐには存在しなくなります。

あなたのクラス型への暗黙的な変換を避けたいときは、明示的なキーワードを使用します。 MyClassintを取るコンストラクタ、および機能f(const MyClass&)を持っている場合は、コンストラクタを作る場合は例えば:-)

、あなたはどちらか

f(42) 

または

f(MyClass(42)) 

としてfを呼び出すことができます明示的には、後者のみが機能します。これは、望ましくない暗黙の変換からあなたを救うことができます。

関連する問題