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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.91543 の関連記事表示

<< 0 >>
■91543  Re[13]: メモリリークに関して
□投稿者/ 魔界の仮面弁士 -(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) ? "同じ" : "違う");
      }
    }




記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -