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

わんくま同盟

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

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

■91539 / 10階層)  メモリリークに関して
□投稿者/ 魔界の仮面弁士 (2220回)-(2019/07/04(Thu) 12:11:33)
No91538 (kiku さん) に返信
> AmbientとはフォームのFontを子コントロールが継承する機能であると理解しました。
> よって、フォームのFontと子コントロールのFontは同じインスタンスである場合がある。

アンビエントの具体例として:

.NET Framework の場合、
デザイン画面で Form に Label を貼って、
その後で Form の Font を変更すると、
Label の Font も連動して変更されます。

このとき、デザイナのプロパティ グリッドを見てみると、
Form の Font プロパティは変更されて太字表示されていますが、
Label の Font は細字表示のままとなります。

Label の Font を意図的に変更すれば、Label の Font プロパティも
太字で表示されますが、この状態だと、Form の Font に連動しなくなります。


ところが、.NET Compact Framework の場合、上記の動作が実装されていませんので、
Compact Framework の実装がアンビエントになっている可能性は低いと予想しています。


> この実験の結果をどのように理解していいか
> 正直に言いますと良くわかりませんでした。

.NET Comapct Framework の Font プロパティの getter は、
アクセスするたびに、新しい Font インスタンスを
生成する実装になっている可能性が高いことが伺えます。

その根拠は、
 var f1 = textBox1.Font;
 var f2 = textBox1.Font;
において、f1 と f2 が別のインスタンスとなったという点からです。
(同じインスタンスを返す条件が存在する可能性を否定することは出来ませんが)


また、No91525 のコードで「get_Font」メソッドの実装状況を調べたところ、
Font プロパティは Control クラスで宣言されているのみで、
継承先(Label や Form や ContainerControl 等)でオーバーライドされていないこともわかります。


という事はすなわち、最初の No91509 にて記述されていた、

>> this.lbl_serialnumber.Font.Dispose();//★対策追加

というコードが無価値であるように思うのです。

Font プロパティにアクセスするたびに新しい Font が生成され、
それがすぐに破棄されるだけなのではないかと。
(メモリ負荷等は見ていないので、アンマネージリソースの管理状況までは分かりませんが)


では、そもそも破棄した Font を使おうとしたらどうなるのか?

var f1 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);
var f2 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);
f2.Dispose();
button1.Font = f1;
button2.Font = f2;
button1.Font.Dispose();



てっきり ObjectDisposedException が発生するのかと思いきや、そうでは無いようです。

.NET Compact Framework の場合は、button1 だけが新しいフォントになります。
button2 の方は以前のフォントのままレンダリングされていました。

一方 .NET Framework においては、button1 / button2 両方とも
新しいフォントでレンダリングされました。エラーになることもなく。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[9]: メモリリークに関して /kiku →Re[11]: メモリリークに関して /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
│          ├ Re[7]: メモリリークに関して / 魔界の仮面弁士 (19/07/04(Thu) 09:13) #91534
│          │└ 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
│                └ メモリリークに関して / 魔界の仮面弁士 (19/07/04(Thu) 12:11) #91539 ←Now
│                  └ 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

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