3

重複の可能性:
デストラクタでポインターを 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キーワードを使用する必要がありますか?

4

4 に答える 4

5

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

于 2011-02-13T15:19:43.983 に答える
4

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

クラス型への暗黙的な変換を避けたい場合は、明示的なキーワードを使用します。:-)

たとえば、 と functionMyClassを受け取るコンストラクターがある場合、次のように呼び出すことができます。intf(const MyClass&)f

f(42)

また

f(MyClass(42))

コンストラクターを明示的にすると、後者のみが機能します。不要な暗黙の変換からあなたを救うことができます。

于 2011-02-13T15:26:09.407 に答える
1

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

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

そうしないと、削除されたオブジェクトを使い続けて、バグに気付く可能性があります(メモリが別のオブジェクトによって上書きされたとき)。このような問題は、デバッグが非常に難しいことがよくあります。

于 2011-02-13T15:18:06.777 に答える
1

それは本当に無意味ではありません。理論的には、値に再びアクセスすることはできないのは事実ですが、値をNULLに設定すると、将来、他のシェナニガンが発生し始めた場合に役立つ可能性があります。

于 2011-02-13T15:18:40.487 に答える