-2

javaまたはc++を使用したオブジェクトの管理に疑問があります。

ケースは、c ++で、動的オブジェクトを作成する場合、それが作成された場所のブロックスコープよりも存続する場合、新しいオブジェクトを実行する必要があり、ポインターを受け取ります。それ以外の場合、このオブジェクトをブロックスコープで使用するだけの場合は、new...を使用してオブジェクトを作成する必要はありません。

ただし、Javaでは、オブジェクトはnullであり、使用できるため、常にnewを使用して作成する必要があります。

何故ですか?それはそれがどのように機能するのですか?

ありがとう

4

5 に答える 5

2

私が思いつく最良の類推は、C++ のすべての型が Java のプリミティブのように振る舞うということです。Java でプリミティブを宣言する場合、 を使用する必要はなくnew、変数をすぐに使用できます。しかし、そのようなプリミティブは、C++ のほとんどのオブジェクトと同様に、現在のスコープでのみ存続します。C++ では、オブジェクトを現在のスコープの外に存在させたい場合は、スタックではなくヒープにメモリを割り当てる必要があるため、これをコンパイラに伝える必要があります。を使用してこれを行うことができますnew。Java では、すべてのオブジェクト (保存プリミティブ) がヒープに割り当てられ、スタック上の唯一のデータはヒープ メモリへの参照とプリミティブです。そのため、Java では、すべてのメモリ割り当ては を使用して行われnewます。

上記は、Java での実際のメモリ管理を簡略化したものです。プリミティブに関するスタック/ヒープ メモリの詳細については、こちらを参照してください

于 2013-03-15T14:49:43.823 に答える
1

この違いは、Java がメモリ管理にガベージ コレクタを使用しているためです。ガベージ コレクターは、オブジェクトのスコープが終了すると (そして到達可能な参照がなくなると) オブジェクトの割り当てを自動的に解除するため、オブジェクトを作成するために 2 つの異なるメソッドを用意する必要はありません。

Java のオブジェクトは、 newなしで初期化される C++ のオブジェクトのように自動的に動作すると言えます。つまり、それらを削除することを考える必要はありません。

于 2013-03-15T14:47:04.567 に答える
0

基本的に、それはまさにそれがどのように機能するかです。new キーワードが使用されると、オブジェクトが作成され、ヒープにポップされます。メソッドの外部でオブジェクトを参照しない場合、ガベージ コレクターによって自動的に再利用されます。理解を深めるために、Java ヒープとガベージ コレクションの基本を少し読んでおくことをお勧めします。そこにはたくさんのリソースがあります。新規参入者には常に頭から先の本をお勧めします。

于 2013-03-15T14:46:46.663 に答える
0

C++では、何でもスタックに割り当てることができます(これは、あなたが言うときに起こることです

ObjectType o;

C++で。

Java では、実際にスタックに割り当てられるのはプリミティブのみです。オブジェクトがスタック上にあることはありません (それはまさにその通りです)。あなたが言う時

ObjectType o;

Java では、オブジェクトは割り当てられず、「変数」のみが割り当てられます。変数はオブジェクトへの参照を持つことができますが、現時点では何もありません。要するに言ってる事と同じ

ObjectType *o = NULL

C++で。

この参照が参照するオブジェクトを実際に割り当てるにはnew、Java で使用する必要があります。

于 2013-03-15T14:54:16.627 に答える
0

たとえば、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 になり、ガベージ コレクターはそれを (すぐではありませんが)収集します。xfoo()fooy...xbarbar

-スタン

于 2013-03-15T15:18:05.767 に答える