私はC++が初めてです。私が読んだことから、Java とは異なり、C++ には自動ガベージ処理がないため、クラスにオブジェクトのデストラクタを追加します。
class A{
class A();
~class A(); // destructor
};
構造体を使用するとどうなるか興味があります。また、クラスにデストラクタを追加しないとどうなりますか? メモリはどのように解放されますか?
私はC++が初めてです。私が読んだことから、Java とは異なり、C++ には自動ガベージ処理がないため、クラスにオブジェクトのデストラクタを追加します。
class A{
class A();
~class A(); // destructor
};
構造体を使用するとどうなるか興味があります。また、クラスにデストラクタを追加しないとどうなりますか? メモリはどのように解放されますか?
答える良い方法は、JavaをC++と比較することだと思います。Javaでは、すべての参照型はヒープに格納され、すべてのプリミティブはスタックに格納されます。これが意味するのは、プリミティブがスコープから外れると破壊されるということです。つまり、それらが宣言されているメソッドが返されるときはいつでも。一方、これは参照型には当てはまりません。
C ++では、どの変数を動的に(ヒープに)または自動的に(スタックに)格納するかを制御します。演算子を使用してオブジェクトを作成するnew
と、対応する。でそのメモリを解放するまで、オブジェクトはヒープに残りますdelete
。演算子なしで変数(またはオブジェクト)を作成するnew
と、オブジェクトがスコープ外になるとそのメモリが解放されます。
コンストラクタとデストラクタに関する質問に答えるには、次のようにします。コンストラクタは、新しいオブジェクトの作成時に常に呼び出されるメソッドです。コンストラクターを指定しない場合は、デフォルトのコンストラクター(引数をとらない)が暗黙指定されます。デストラクタは、オブジェクトがスコープ外になったとき、またはdelete
演算子を使用してオブジェクトを削除した場合(を使用して動的に作成した場合new
)に呼び出されます。
C++にはガベージコレクションはありません。それはほぼ真実です。デストラクタは、ごみの収集にも使用される非常に便利なツールです。
クラスには、デフォルトのコンストラクター、コピーコンストラクター、代入演算子のオーバーロード、およびデストラクタの4つの事前定義されたメソッドがあります。これは、このメソッドにデフォルトバージョンがあることを意味します。
定義する場合:
class A {
private:
int* a;
public:
A() { a = new int(5); }
};
デフォルトのデストラクタは、使用したメモリの割り当てを解除せずに、ポインタ自体によって割り当てられたメモリを消去しますint(5)
。
したがって、特定のデストラクタを定義する必要があります。
~A() { delete a; }
または、スマートポインタを使用することをお勧めします。
クラスに適用されるのと同じ規則が C++ の構造体にも適用されますが、例外は既定のアクセス レベルであり、それ以外には適用されません。
デストラクタを定義しない場合、コンパイラはデフォルトのデストラクタを定義します。クラスと構造体の両方。
デフォルトのコンストラクタは、基本クラスのデストラクタと、それらを持つすべてのメンバーのデストラクタを呼び出します。デフォルトのデストラクタは、空のバージョンを手動で作成する必要がないクラスで特別なことをする必要がない場合の単なる商品です(動的に割り当てられたオブジェクトをヒープから解放したり、非自動メンバーを管理したりするなど)。
C++ の構造体とクラスの唯一の違いは、デフォルトのアクセス制御です。メンバーはデフォルトで、クラスではプライベートであり、構造体ではパブリックです。独自のデストラクタを定義しない場合、コンパイラはデフォルトのデストラクタを提供します。オブジェクトが破棄されると、すべてのメンバーも破棄されます。クラスメンバーのいずれかがヒープ割り当てメモリを指している場合にのみ、独自のデストラクタを定義する必要があります。