10

C++ デストラクタの理解を検証しようとしています。

自分で作成しない場合、C++ がデフォルトのデストラクタを提供することを何度も読みました。しかし、これは、デストラクタを記述しても、コンパイラがスタック割り当てクラス フィールドのデフォルトのクリーンアップを提供しないことを意味するのでしょうか?

私の推測では、独自のデストラクタを提供するかどうかに関係なく、すべてのクラス フィールドが破棄されるというのが唯一の正しい動作です。その場合、私が何度も読んだ声明は実際には少し誤解を招くものであり、次のようにより適切に述べることができます。

「独自のデストラクタを作成するかどうかにかかわらず、C++ コンパイラは常にデフォルトのデストラクタに似たシーケンスを作成して、クラスのメンバー変数の割り当てを解除します。その後、独自のデストラクタを定義することにより、必要に応じて追加の割り当て解除または他のタスクを指定できます」

これは正しいです?

4

3 に答える 3

2

はい - オブジェクト内に含まれるすべてのオブジェクトは、デストラクタがオブジェクトを破棄するために何もしない場合でも、オブジェクトの破棄の一部として破棄されます。

実際、デストラクタは通常、オブジェクト内に含まれるオブジェクトを破棄するために何もしません。通常、オブジェクト内の何か (オブジェクトへのポインター、ネットワークまたはデータベース接続へのハンドルなど) を介してリモートで所有されているオブジェクトを破棄します。

これに対する一般的な唯一の例外は、オブジェクトに何らかのバッファーが含まれていて、配置を使用newしてそのバッファーに何かを構築した場合です。配置を使用する場合はnew、通常、dtor も直接呼び出すことを計画します。[「一般的」という表現は、これを目にしたり使用したりする頻度を誇張している可能性があることに注意してください。実際には非常にまれですが、他の可能性はさらにまれです。]

于 2013-11-09T03:49:19.253 に答える