たとえば、C++ で動的オブジェクトを作成したい場合は、それが作成された場所のブロック スコープよりも長く存続するオブジェクトであり、新しいオブジェクトを作成する必要があり、ポインタを受け取ります。
C++のnew演算子は、ヒープに領域を割り当てます。ヒープは、メイン メモリの大部分が存在する場所です。これを行う場合、free演算子を使用して作業が完了したときに、そのスペースを解放する責任があります。
それ以外の場合、このオブジェクトをブロック スコープで使用するだけの場合は、new... を使用して作成する必要はありません。
C++ で変数を宣言すると、メモリはスタックに割り当てられます。スタックはローカル データが格納される場所であり、関数の実行中にスタックにプッシュ(追加) されたものはすべて、関数が戻るときに自動的にポップ(削除) されます。通常、スタックはヒープよりもはるかに小さいですが、スタックを使用する利点があります。メモリ管理について心配する必要がない、高速であるなどです。
しかし Java では、常に new を使用して作成する必要があります。そうでない場合、オブジェクトは null であり、使用できるからです。
Java で変数を宣言すると、それらは再びスタックに格納されますint i = new int(3);
。Object x;
宣言するようなことをすると、それは type のオブジェクトへの参照x
になります。ただし、値を割り当てていないため、参照はnullです(オブジェクトがないため、オブジェクトではありません)。Object
Javaのnew演算子は、大まかに言えば、ヒープにスペースを割り当て、呼び出されたオブジェクトのコンストラクターを呼び出し、構築されたオブジェクトへの参照を返します。C++ との違いは、オブジェクトを自分で解放する必要がないことです。ガベージ コレクターがあります。本質的には、オブジェクトを指す参照の数を監視し、それらがゼロになると、オブジェクトを自動的に削除します。
だからあなたがするとき
オブジェクト y = 新しいオブジェクト();
x = y;
同じオブジェクトを指す 2 つの参照 (x と y) を取得します。このような関数呼び出しがある場合
オブジェクト foo() {
オブジェクト y = 新しいオブジェクト();
y を返します。
}
ボイドバー() {
オブジェクト x = foo();
...
}
あなたの
...
部分には、 で作成されたオブジェクトを指す
bar()
参照があります。が返されたため、参照は解放されているため、プログラムの一部でこのオブジェクトへの参照は 1 つだけになります。andのどこにも参照をコピーしないと、オブジェクトへの参照は 0 になり、ガベージ コレクターはそれを (すぐではありませんが)
収集します。x
foo()
foo
y
...
x
bar
bar
-スタン