C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■91534 / 7階層)  メモリリークに関して
□投稿者/ 魔界の仮面弁士 (2218回)-(2019/07/04(Thu) 09:13:04)
No91530 (魔界の仮面弁士) に追記
>>あと、経験則的なところで言えば、.NET Compact Framework 環境の場合、
>>オブジェクトの使用後は、参照変数に Nothing 代入を積極的に行った方が良いみたいです。
> Nothing の代入有無で、本当に解放状況が変化するかどうかを確認してみました。


すみません!
C# の質問に、うっかり VB で回答してたことに、今朝になって気がつきました。

# .NET 対応前、CE アプリを eVB3 で行ってきた期間が長すぎて、
# CE 環境だと反射的に VB で書く癖が…。orz


> 端末を再起動して、空きメモリが十分に確保されている状態において、
> Button1 でモードレス フォームを表示させた後、
> Button2 でそれを Close させています。
> すると、Close 直後の ★の行の Nothing 代入がコメントアウトされていた場合、
> Form2 および LabelEx が直ちに Dispose されないケースが確認できました。

上記の「Close 後、直ちに Dispose されていない」現象ですが、
改めて C# (CFx 3.5 SP1) でも実験してみたところ、上記の状況を再現させられませんでした。
Close されたら、null を代入せずとも即座に Dispose されているようにみえる…。


改めて、昨日の VB コードでも再検証してみましたが、
昨日と比べて問題の再現率が大幅に低下していました。
狙って再現させることは難しそうです。


public partial class Form1 : Form
{
  private Form2 f = null;
  public Form1()
  {
    InitializeComponent();
    DoubleClick += delegate { Close(); };
  }

  /// <summary>新規に Form2 を表示するコード</summary>
  private void button1_Click(object sender, EventArgs e)
  {
    f = new Form2();
    f.Show();
  }

  /// <summary>直前に表示された Form2 を閉じるコード</summary>
  private void button2_Click(object sender, EventArgs e)
  {
    if (f != null /* && !f.IsDisposed */)
    {
      f.Close();
      // f = null; // ★
    }
  }
}

// -=-=-=-=-=-=-=-=-=-=-=-=-

public partial class Form2 : Form
{
  private readonly Guid Id = Guid.Empty;
  public Form2()
  {
    Id = Guid.NewGuid();
    Trace.WriteLine(String.Format("==> {0} 生成 {1}", GetType().Name, Id));
    InitializeComponent();
    Controls.Add(new LabelEx());
    Text = Id.ToString();
    DoubleClick += delegate { Close(); };
    // Disposed += delegate { Trace.WriteLine(string.Format("<== {0} 破棄 {1}", GetType().Name, Id)); };
  }
  public sealed class LabelEx : Label
  {
    private readonly Guid Id;
    public LabelEx()
    {
      Id = Guid.NewGuid();
      Trace.WriteLine(String.Format("==> {0} 生成 {1}", GetType().Name, Id));
      Text = Id.ToString();
      //Disposed += delegate { Trace.WriteLine(string.Format("<== {0} 破棄 {1}", GetType().Name, Id)); };
    }
    protected override void Dispose(bool disposing)
    {
      Trace.WriteLine(string.Format("<== {0} 破棄 {1} ({2})", GetType().Name, Id, disposing));
      base.Dispose(disposing);
    }
  }
  protected override void Dispose(bool disposing)
  {
    Trace.WriteLine(string.Format("<== {0} 破棄 {1} ({2})", GetType().Name, Id, disposing));
    if (disposing && (components != null))
    {
      components.Dispose();
    }
    base.Dispose(disposing);
  }
}
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[6]: メモリリークに関して /魔界の仮面弁士 →Re[8]: メモリリークに関して /kiku
 
上記関連ツリー

メモリリークに関して / kiku (19/07/02(Tue) 17:06) #91509
Re[1]: メモリリークに関して / PANG2 (19/07/02(Tue) 17:53) #91511
│└ Re[2]: メモリリークに関して / kiku (19/07/03(Wed) 09:06) #91516
Re[1]: メモリリークに関して / WebSurfer (19/07/02(Tue) 18:32) #91513
│└ Re[2]: メモリリークに関して / kiku (19/07/03(Wed) 09:10) #91517
│  └ Re[3]: メモリリークに関して / WebSurfer (19/07/03(Wed) 11:43) #91519
│    ├ Re[4]: メモリリークに関して / kiku (19/07/03(Wed) 13:26) #91521
│    │└ Re[5]: メモリリークに関して / WebSurfer (19/07/03(Wed) 14:40) #91522
│    │  └ Re[6]: メモリリークに関して / kiku (19/07/03(Wed) 17:09) #91526
│    └ Re[4]: メモリリークに関して / 魔界の仮面弁士 (19/07/03(Wed) 17:07) #91525
│      └ Re[5]: メモリリークに関して / kiku (19/07/03(Wed) 17:43) #91528
│        └ Re[6]: メモリリークに関して / 魔界の仮面弁士 (19/07/03(Wed) 19:37) #91530
│          ├ メモリリークに関して / 魔界の仮面弁士 (19/07/04(Thu) 09:13) #91534 ←Now
│          │└ Re[8]: メモリリークに関して / kiku (19/07/04(Thu) 09:33) #91536
│          └ Re[7]: メモリリークに関して / kiku (19/07/04(Thu) 09:08) #91533
│            └ Re[8]: メモリリークに関して / 魔界の仮面弁士 (19/07/04(Thu) 09:59) #91537
│              └ Re[9]: メモリリークに関して / kiku (19/07/04(Thu) 10:46) #91538
│                └ Re[10]: メモリリークに関して / 魔界の仮面弁士 (19/07/04(Thu) 12:11) #91539
│                  └ Re[11]: メモリリークに関して / kiku (19/07/04(Thu) 13:13) #91540
│                    └ Re[12]: メモリリークに関して / 魔界の仮面弁士 (19/07/04(Thu) 15:18) #91541
│                      ├ Re[13]: メモリリークに関して / 魔界の仮面弁士 (19/07/04(Thu) 15:26) #91543
│                      │└ Re[14]: メモリリークに関して / kiku (19/07/04(Thu) 16:12) #91545
│                      │  └ Re[15]: メモリリークに関して / kiku (19/07/04(Thu) 16:14) #91546
│                      │    └ Re[16]: メモリリークに関して / kiku (19/07/08(Mon) 11:36) #91569
│                      │      ├ Re[17]: メモリリークに関して / kiku (19/07/08(Mon) 11:36) #91570 解決済み
│                      │      └ Re[17]: メモリリークに関して / 魔界の仮面弁士 (19/07/08(Mon) 14:19) #91571 解決済み
│                      │        └ Re[18]: メモリリークに関して / kiku (19/07/09(Tue) 10:26) #91572 解決済み
│                      │          └ Re[19]: メモリリークに関して / shu (19/07/10(Wed) 15:55) #91585 解決済み
│                      │            ├ Re[20]: メモリリークに関して / 魔界の仮面弁士 (19/07/10(Wed) 16:37) #91586 解決済み
│                      │            │└ Re[21]: メモリリークに関して / kiku (19/07/11(Thu) 08:49) #91588 解決済み
│                      │            └ Re[20]: メモリリークに関して / kiku (19/07/11(Thu) 08:43) #91587 解決済み
│                      └ Re[13]: メモリリークに関して / kiku (19/07/04(Thu) 16:08) #91544
Re[1]: メモリリークに関して / 魔界の仮面弁士 (19/07/02(Tue) 20:22) #91515
  └ Re[2]: メモリリークに関して / kiku (19/07/03(Wed) 09:14) #91518
    ├ Re[3]: メモリリークに関して / 魔界の仮面弁士 (19/07/03(Wed) 13:17) #91520
    │└ Re[4]: メモリリークに関して / kiku (19/07/03(Wed) 16:50) #91523
    │  ├ Re[5]: メモリリークに関して / Hongliang (19/07/03(Wed) 17:04) #91524
    │  │└ Re[6]: メモリリークに関して / kiku (19/07/03(Wed) 17:20) #91527
    │  └ Re[5]: メモリリークに関して / PANG2 (19/07/03(Wed) 23:35) #91531
    │    └ Re[6]: メモリリークに関して / kiku (19/07/04(Thu) 09:23) #91535
    └ Re[3]: メモリリークに関して / 魔界の仮面弁士 (19/07/03(Wed) 19:14) #91529
      └ Re[4]: メモリリークに関して / kiku (19/07/04(Thu) 09:00) #91532

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信