4

デストラクタはポインタレス クラスで宣言/実装する必要がありますか? 持っている/持っていないことの利点はありますか?

私は何ですか:

class Point
{
public: 
    int X, Y;
    Point(int x, int y);
    //~Point(void);       //should I uncoment it and implement empty destructor ?
}
4

2 に答える 2

5

デストラクタはポインタレス クラスで宣言/実装する必要がありますか?

不要【条件あり】。コンパイラが生成します。
コンパイラが実行しない特定の何かを実行したい場合にのみ、1 つを指定する必要があります。
例えば:

  • リソース管理(メモリ管理、ファイルハンドリング)、
  • ロギング、
  • ネットワーク接続を閉じます。
  • つまり、オブジェクトが破棄されるたびに実行する必要があるカスタム機能

一般的な経験則は、
「コピー コンストラクターまたはコピー代入演算子を提供する必要がある場合は、おそらく独自のデストラクタも提供する必要がある」です。
一般に、このルールは3 つのルールとして知られています。


[条件が適用されます] クラスが継承の基本クラスとして機能することを意図しており、実装deleteで派生クラス オブジェクトを指す基本クラス ポインターを呼び出す必要がある場合は、デストラクタを提供し、それをvirtual基本クラスとしてマークする必要があります。これを行うと、未定義の動作が発生します。


持っている/持っていないことの利点はありますか?

なし。コンパイラが同じことを行うため、追加の型付けを行う必要はありません。

于 2013-01-08T14:57:59.713 に答える
2

いいえ、リソースを管理していない場合は、非デストラクタを使用しないでください。virtual

クラスから派生し、ポリモーフィックな削除 (つまり、基本クラス ポインターを介した派生オブジェクト) を計画している場合は、デストラクタdeleteが必要です。virtual

実際、リソースを直接管理するべきではありませんが、ラッパーを使用する必要があります。つまり、生のポインターの代わりにスマートポインターを使用し、手動で割り当て/割り当てを解除します。

于 2013-01-08T14:57:50.820 に答える