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

わんくま同盟

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

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


■91543 / )  Re[13]: メモリリークに関して
□投稿者/ 魔界の仮面弁士 (2223回)-(2019/07/04(Thu) 15:26:21)
No91541 (魔界の仮面弁士) に追記
> Control.Font プロパティに「Dispose 済みの Font」や「null」が渡された場合、
> 『既定のフォントがセットされる』という動作になっているようです。


そもそも Font プロパティで内部管理されているものは、
Font オブジェクトのインスタンスそのものではなく、
それが指し示すアンマネージなハンドルっぽい?


// Compact Framework の Font オブジェクトの内部ハンドルを得る
static IntPtr GetHandle(Font f)
{
  BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance;
  FieldInfo field = typeof(Font).GetField("m_htx", bf);
  if (field == null || f == null)
  {
    return IntPtr.Zero;
  }
  else
  {
    return (IntPtr)field.GetValue(f);
  }
}


private void button1_Click(object sender, EventArgs e)
{
  using (var f1 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular))
  using (var f2 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular))
  {
    // 別のインスタンスだけど、同じハンドルが得られている。
    // String でいうところの 文字列インターンプールのようなものだろうか?
    var h1 = GetHandle(f1);
    var h2 = GetHandle(f2);
    MessageBox.Show((h1 == h2) ? "同じ" : "違う");

    // 一方のインスタンスを破棄してみる
    f1.Dispose();

    // 破棄した方からは IntPtr.Zero が返される。
    var h3 = GetHandle(f1);
    var h4 = GetHandle(f2);
    MessageBox.Show((h3 == h4) ? "同じ" : "違う");
  }
}





返信 編集キー/


管理者用

- Child Tree -