7

この質問は、 Thinking in Java、第 2 版、109 ページのScope of Object の章に基づいており、 newを使用して Java オブジェクトを作成すると、スコープの終わりを通過してぶら下がると言われています。次の例を示します。

{ 
  String s = new String("a string"); 
} /* end of scope */ 

それから、それは言います、

参照 sはスコープの最後で消えます。ただし、s が指していた String オブジェクトは、まだメモリを占有しています。このコードでは、オブジェクトへの唯一の参照が範囲外であるため、オブジェクトにアクセスする方法はありません。

したがって、正しく理解できれば、テキスト「a string」はまだメモリ内にありますが、最初の文字「a」のメモリ アドレスを持つポインタは存在しません。これはどういう意味ですか?

続けて、

new で作成されたオブジェクトは必要なだけ存続するため、Java では多数の C++ プログラミングの問題が簡単に解消されます。

なぜこれが有利になるのでしょうか?上記の例では、文字列データは引き続きメモリ内に存在し、アクセスする方法はありません (ポインターが範囲外になった後に破棄されたため)。これはリソースを消費するだけです。

4

8 に答える 8

2

ガベージ コレクタの仕組みについては、215 ページを参照してください。

Java コードの実行中、ガベージ コレクターは定期的に実行され、参照されていないすべてのオブジェクトを検索し、それらによって占有されているメモリを解放します。これが発生するfinalizeと、オブジェクトでメソッドが呼び出されます (定義されている場合)。その時点で、オブジェクトに必要なクリーンアップを行います。

deleteC++ では、キーワードを使用して自分でメモリを解放することを心配する必要があります。そうしないと、メモリ リークが発生する可能性があります。

Java では、メモリ割り当ての管理を管理対象オブジェクトのライフサイクル管理と交換しています。

于 2013-07-15T05:29:57.457 に答える
2

ガベージ コレクションの準備が整うと、デタッチされたオブジェクトを GC で収集するまで、メモリを占有しますObjectscope

于 2013-07-15T05:19:32.343 に答える
1

Java では、オブジェクトへのすべての参照が null になるかスコープ外になると、オブジェクト自体がガベージ コレクターによる破棄の候補になります。GC は独自のアルゴリズムに従ってこれを自動的に行いますが、C++ ではオブジェクトを明示的に破棄する必要があります。さらに、インターンと呼ばれるものが原因で、文字列が引き続き存在する場合があります。

于 2013-07-15T05:24:22.410 に答える
1

オブジェクトはスコープ外であるため、Java ガベージ コレクタによって自動的にガベージ コレクションされます。Java では Java ランタイムが自動的にガベージ コレクションを処理し、最終的にメモリが再利用されるため、C++ よりも有利です。これはC++には当てはまりません

于 2013-07-15T05:20:16.870 に答える
1

コードのブロックがまだメモリを占有しているという本が何を言おうとしているのか、私には理解できません。おそらく、参照変数 (例のように) がスコープ外になったからといって、メモリがすぐにs解放されるわけではないということを言おうとしているのでしょう。(少なくともあなたが投稿したものでは)言い損ねているのは、そのようなメモリは自動ガベージ コレクションの対象であり、実際には、そのような孤立したメモリ ブロックが収集されるかのようにプログラムする必要があるということです。

C++ と比較した場合の Java のガベージ コレクションの優れた点は、すべてが自動的に行われることです。メモリ割り当てへのすべての強い参照 (すべての間接参照を含む) が範囲外になると、そのメモリ ブロックは自動ガベージ コレクションの対象になります。一言でいうと以上です。Java は、循環参照などを正しく処理し、構造がスコープ内にある参照値から直接的または間接的にアクセスできない場合、任意の複雑なデータ構造をガベージ コレクションします。

また、インターンのために文字列には特別なルールがあるため、その例では本が失敗しました。

于 2013-07-15T05:20:57.503 に答える
1

Java ガベージ コレクタがクリーンアップするまで、メモリに常駐します。定期的に行うもの。つまり、自分でメモリを管理する必要はありません。

メモリの割り当てと割り当て解除を気にせずにオブジェクトを作成できます。

于 2013-07-15T05:19:08.223 に答える