デストラクタはポインタレス クラスで宣言/実装する必要がありますか? 持っている/持っていないことの利点はありますか?
私は何ですか:
class Point
{
public:
int X, Y;
Point(int x, int y);
//~Point(void); //should I uncoment it and implement empty destructor ?
}
デストラクタはポインタレス クラスで宣言/実装する必要がありますか? 持っている/持っていないことの利点はありますか?
私は何ですか:
class Point
{
public:
int X, Y;
Point(int x, int y);
//~Point(void); //should I uncoment it and implement empty destructor ?
}
デストラクタはポインタレス クラスで宣言/実装する必要がありますか?
不要【条件あり】。コンパイラが生成します。
コンパイラが実行しない特定の何かを実行したい場合にのみ、1 つを指定する必要があります。
例えば:
一般的な経験則は、
「コピー コンストラクターまたはコピー代入演算子を提供する必要がある場合は、おそらく独自のデストラクタも提供する必要がある」です。
一般に、このルールは3 つのルールとして知られています。
[条件が適用されます] クラスが継承の基本クラスとして機能することを意図しており、実装delete
で派生クラス オブジェクトを指す基本クラス ポインターを呼び出す必要がある場合は、デストラクタを提供し、それをvirtual
基本クラスとしてマークする必要があります。これを行うと、未定義の動作が発生します。
持っている/持っていないことの利点はありますか?
なし。コンパイラが同じことを行うため、追加の型付けを行う必要はありません。
いいえ、リソースを管理していない場合は、非デストラクタを使用しないでください。virtual
クラスから派生し、ポリモーフィックな削除 (つまり、基本クラス ポインターを介した派生オブジェクト) を計画している場合は、デストラクタdelete
が必要です。virtual
実際、リソースを直接管理するべきではありませんが、ラッパーを使用する必要があります。つまり、生のポインターの代わりにスマートポインターを使用し、手動で割り当て/割り当てを解除します。