質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

14025閲覧

メモリリーク例について

kazuya_

総合スコア78

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2017/07/06 03:45

下記説明文の意味がよくわかりません。コード例で説明してもらえませんか?

<説明文>
staticなフィールドはルート参照で,そこから(強)参照で辿れるインスタンスは,解放されません。
クラスTのstaticなフィールドにList<T>を用意し,TのコンストラクタでそのフィールドにthisをAddしている場合に、staticなフィールドから辿れるインスタンスは,明示的にListからRemoveするなり,nullを代入するなりして,参照を辿れなくする必要があります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiichi54321

2017/07/06 03:58

こちらもなんでその説明文がでることになったのかわかりません。
guest

回答2

0

ベストアンサー

変数のメモリ解放を考える際に必要なのは 束縛 です。
その変数が何に束縛されているかを考えます。

csharp

1public void foo() { 2 var s = "test"; 3}

この s は関数 foo を抜けると「もう解放してよいよ」というマークを付けられます。s は関数 foo の実行スコープに束縛されています。マークが付けられた物はメモリが減ってきたタイミング等で消されていきます。

クラスも同様に

csharp

1var d = new Foo();

d の存在が必要無くなったタイミングでマークが付けられ消えていきます。

ただクラスの static 変数は永続的に存在します。何をされても何時でも参照出来る値です。プログラムが終了するまでそこに束縛される事になります。

csharp

1public class Foo { 2 public static List<String> l = new ArrayList<>(); 3}

l にデータを追加したら誰も消してくれないので、Remove するか null を代入する事で GC の為のマークを付けて貰って下さい、という意味になります。

投稿2017/07/06 05:21

編集2017/07/06 05:23
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuya_

2017/07/06 07:14

ありがとうございます。
guest

0

java

1<User.class> 2public class User { 3 public static List<User> instances = new ArrayList<>(); 4 5 private String name; 6 7 public User(String name){ 8 this.name = name; 9 instances.add(this); 10 } 11 12 public String getName(){ 13 return name; 14 } 15} 16 17<Main.class> 18public class Main{ 19 public static void main(String[] args){ 20 User u1 = new User("太郎"); 21 User u2 = new User("花子"); 22 23 u1 = null; // インスタンス解放 24 u2 = null; // インスタンス解放 25 26 User.instances.forEach((u) -> { 27 System.out.println(u.getName()); // 名前が出力される 28 }); 29 } 30} 31

instancesに格納されているUserクラスのインスタンスは、明示的にinstancesから削除してあげないと、Tクラスのインスタンスは残り続けますよという意味かな?

通常、使われなくなったインスタンスはGCで解放されます。

投稿2017/07/06 03:57

編集2017/07/06 04:15
mr-hisa-child

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuya_

2017/07/06 07:13

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問