1

Google は変な例しか出していないので、次のコードはメモリ リークではないかと思います。基本的に、クラスがある場合Tree

public class Tree{

     private Bird[] birds;

     public Tree(){
          birds = new Bird[100];
     }

}

そして、私は次のようなへのクラス参照を保持していTreeます:

Tree myTree = new Tree();

その後すぐに、その参照をnull次のように設定しました。

myTree = null;

割り当てられた 100 の Bird はすべて、ガベージ コレクタによってツリー クラスで処理されますか? それとも方法が必要delete()ですか?Java にはデストラクタがないことはわかっていますが、それでもこの多層クラスの例は私を混乱させます。

内側Tree.java

public void deleteBirds{
     birds = null;
}
4

1 に答える 1

6

割り当てられた 100 の Bird はすべて、ガベージ コレクタによってツリー クラスで処理されますか?

さて、あなたのコードは実際には のインスタンスを作成しませんBird。配列を作成するだけで、その配列のすべての要素がnull最初になります。

ただし、基本的な答えは「はい」です。配列への参照が他になく、Bird他の場所で作成する可能性のあるオブジェクトへの参照が他にない場合、ガベージコレクターがそれらを処理します。ほとんどの場合、「削除」メソッドを記述するべきではありません。

おそらくステートメントも必要ありませんmyTree = null;...それがスコープ外のローカル変数である場合、またはガベージコレクションの対象となるオブジェクト内のインスタンス変数である場合、それは無意味です。

比較的新しい Java プログラマーがガベージ コレクターを信頼して制御を手放すことを学ぶには、しばらく時間がかかる場合がありますが、一度そうすると、コードははるかに単純になります :)

于 2014-04-21T10:01:59.147 に答える