投稿数 - 437, コメント - 6558, トラックバック - 156

誰も参照していないフォームは、何故 GC の対象にならないのか

ネタ元 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28778&forum=7&5

こんな話は大好きだ。

確かに、ローカルスコープで作ったインスタンスは、ローカル変数しか参照していなく、他に誰も参照していなかったら、いつか GC の対象になる。Form とて例外ではなかろう。しかし、実際はそうではない。Form は明確に誰も参照していなくても、GC の対象とならないのだ。(後で述べるが、実際は参照している奴が存在する)

Form に限らずコントロールは全てウィンドウハンドルを持つ。コントロールは全て「ウィンドウ」なのだ。.NET ではウィンドウハンドルを持つウィンドウを「System.Windows.Forms.Control」として扱っている。各コントロールはこのクラスから派生しているわけだ。Form もその一つである。Control は内部に System.Windows.Forms.NativeWindow のインスタンスを持ち、ウィンドウハンドルを管理している。Control は Dispose() 時に NativeWindow.DestroyHandle() を呼んでウィンドウハンドルを破棄しているはずだ。

NativeWindow のヘルプを見ると「ウィンドウは、ウィンドウ ハンドルが関連付けられている場合は、ガベージ コレクションの対象にはなりません。」とある。何故だ?どう実現している?

詳細に調べていくと、NativeWindow は内部に GCHandle のインスタンスを保持していた。NativeWindow がウィンドウハンドルに関連付けられていると GC の対象にならないのは GCHandle が鍵なのだ。

GCHandle.Alloc() で新しい GCHandle を作成する。そして GCHandle.Target にガベージコレクションの対象としたくないインスタンスの参照を設定してやればよいのだ。今回の例で言えば、トップレベルの Form のインスタンスの参照だ。(ここでトップレベルの Form のインスタンスの参照をどのように得ているのかは調査中)

結局、Form は自身が内部に持つ GCHandle に参照される事になる。後は GCHandle が誰かに参照されれば問題は解決だ。

GCHandle は誰に参照されているのか?

これは CLR しか預かり知らぬ所。CLR が管理している領域でもあるのか、GC が管理しているのかは分からない。(情報求ム)とにかく、GCHandle は GCHandle.Alloc() したら誰かに参照されている状態で取得できる。

改めて .NET の設計の巧さに拍手だ。

ウィンドウハンドルに限らず、GCHandle を使えば GC を上手に使いこなす事ができるだろう。

投稿日時 : 2006年2月27日 14:35

フィードバック

# re: 誰も参照していないフォームは、何故 GC の対象にならないのか

やっぱり、囚人さんが釣れると思ったw
2006/02/27 15:02 | じゃんぬ

# re: 誰も参照していないフォームは、何故 GC の対象にならないのか

もう好みがバレているようですね。
2006/02/27 15:16 | 囚人

# re: 誰も参照していないフォームは、何故 GC の対象にならないのか

誘う時にバレているって言ってませんでしたっけ? (w
こうやって Blog で掘り下げて頂くと助かりますね。
2006/02/27 16:02 | じゃんぬ

# re: 誰も参照していないフォームは、何故 GC の対象にならないのか

GC だけに注目しているようなので、ネタ投下 ;-)

モーダレスなフォームである Form1, Form2 が存在し、Form1 上に TextBox1 が配置されている時

TextBox textBox = TextBox1;

Form1.Controls.Remove (textBox);
Form2.Controls.Add (textBox);

が「ちゃんと動く」のは何故でしょうか?

特に、Remove() と Add() の行間に注目です。

Windows には「子ウィンドウ(=コモンコントロールは出来合いの子ウィンドウです)は必ずトップレベルウィンドウに保有されていなければならない」という大原則があるはずなのですが。。。
2006/03/02 11:57 | 渋木宏明(ひどり)

# re: 誰も参照していないフォームは、何故 GC の対象にならないのか

>GC だけに注目しているようなので、ネタ投下 ;-)

む・・・。これは一体…。
ネタ爆弾被弾しました。次回作にご期待ください^^;
2006/03/03 8:52 | 囚人

# 誰も参照していないフォームは、何故 GC の対象にならないのか(その2)

誰も参照していないフォームは、何故 GC の対象にならないのか(その2)
2006/04/10 2:08 | 囚人のジレンマな日々

# thanks for the postmishertAtroro

Useful blog website, keep me personally through searching it, I am seriously interested to find out another recommendation of it.
2010/11/08 22:30 | emt training

# re: .NET Fx 2.0 での XMLコメント ドキュメント化ツール

http://www.louisvuittonmessengerbag.us louis vuitton messenger
http://www.vintage-chanel-bags.co Vintage Chanel Handbags
http://www.kate-spade.net.au Kate Spade Australia
http://www.burberryoutlet.co Burberry Outlet Online
http://www.louisvuittonwalletforwomen.net louis vuitton wallet for women
http://www.ugg-outlet.net Ugg Outlet Online
http://www.basketballshoes.in.net cheap basketball shoes
http://www.menssunglasses.us Mens Sunglasses
http://www.gucci-bags.us.com gucci bags outlet
http://www.mcm-backpack.us mcm backpack
http://www.louisvuittonshoesmen.net.in cheap louis vuitton shoes
http://www.cheapmichaelkorshandbags.biz cheap michael kors handbags
http://www.gucciclutch.us gucci clutch purse
http://www.burberryonsale.net burberry bags on sale
http://www.louisvuittontravelbag.us louis vuitton travel bag replica
http://www.longchamp-le-pliage-large.com Longchamp Factory Outlet Online
http://www.michaelkorsclutch.us cheap michael kors clutch
http://www.michaelkorsbagsoutlet.us.com michael kors store online
http://www.coachdiaperbag.co Coach Factory Outlet Online
http://www.prada-belt.us prada belts for men
http://www.coachdiaperbag.co coach diaper bags on sale
http://www.louisvuittondufflebag.com authentic louis vuitton duffle bag
http://www.coachtotebags.us Coach Bags
http://www.longchamp-tote.us longchamp tote
http://www.louisvuittonevaclutch.org Authentic Louis Vuitton Eva Clutch
http://www.burberryonsale.net burberry bags on sale online
http://www.gucci-bags.us.com Louis Vuitton Bags
http://www.louisvuittonshoulderbag.net Louis Vuitton Tote Bags
http://www.mcmrucksack.us mcm outlet sale
http://www.louisvuittonevaclutch.org Louis Vuitton Eva Clutch Bag
2016/01/06 15:09 | jlgg

# re: [WPF][C#]テキストボックスをフォーカスがくると全選択状態にしたい

20161.29wengdongdong
http://www.truereligion-outlet.net.co
http://www.michaelkorshandbags.cc
http://coach.eshopping.us.com
http://www.chiflatiron.in.net
http://www.nike-airmax.org.uk
http://www.ralphlaurenuk.me.uk
http://www.nike-airmax90.me.uk
http://www.coachoutlet-storeonline.in.net
http://www.quality-outlet.com
http://www.get-coachoutletonline.org
http://www.louboutinshoes.cc
http://www.mymichaelkorssoutlets.org
http://www.mizunorunningshoes.in.net
http://jordan.outletmalls.us.com
http://canadagoose.adsmall.us.com
http://www.basketballshoes.net.co
http://www.louisvuittonoutlets.name
http://www.toms.in.net
http://www.coach-factory-outlet-online.us.com
http://www.hermesuk.org.uk
http://www.tomsshoes.us.com
http://www.longchampoutlet.net.co
http://www.adidas-shoes.me.uk
http://www.saclongchamp-solde.fr
http://www.coachoutlet-storeonline.us.com
http://www.fitflops.us
http://www.ugg-boots-australia.com
http://www.nikefreeruns.uk
http://tiffany.outletmalls.us.com
http://www.truereligion-outlet.com
http://www.katespadeoutletsale.in.net
http://www.louisvuitton-borse.it
http://www.sac-longchamppliage.fr
http://www.michael-kors-handbags.uk
http://www.nikerosherunwomen.me.uk
http://www.canadagooseuk.me.uk
http://oakley.shopgioia.com
http://christianlouboutin.shopgioia.com
http://www.jordan13.org
http://www.michaelkorsoutletoff.in.net
http://www.chaussure-louboutin.fr
http://www.canadagooseoutlet.cc
http://www.adidas-trainers.me.uk
http://www.michael-korsuk.me.uk
http://www.michaelkors-outletonlines.in.net
http://www.coach-factoryoutlet.com.co
http://truereligion.adsmall.us.com
http://www.outlet-toms.cc
http://toms.adsmall.us.com
http://www.michaelkors-bags.me.uk
http://www.airforce1-nike.fr
http://www.oakleysunglassesfake.in.net
http://www.chaussurelouboutin-pascher.fr
http://www.nikesb.uk
http://www.vipmichaelkors-outletonline.com
http://www.nike-blazerlow.fr
http://www.rolex-replicawatches.com.co
http://www.ugg-boots-store.com
http://www.ugg-sale.in.net
http://www.jordan-femmepascher.fr
http://christianlouboutin.outletmalls.us.com
http://www.toms-outlet.cc
http://www.kate-spadeoutlet.us
http://www.mcmhandbags.name
http://www.true-religionjeans.net.co
http://www.cheap-uggsonsale.in.net
http://www.nikestoreuk.me.uk
http://www.ralph-lauren.me.uk
http://www.niketrainers.com.co
http://www.timberlanduk.me.uk
http://www.kate-spadeoutlet.com.co
http://www.sunglass-outlet.us
コメント
2016/01/29 16:38 | wengdongdong

# дно фильм

http://454654654333s.clicforum.com/
Спасибо за внимание! Любимые мои!!!
2016/03/14 22:34 | Pugachevn1974

# Ладно люди серьезно хватит поддерживать на словах.А реально голосовать

http://p90321by.bget.ru/
Спасибо за внимание! Любимые мои!!!
2016/03/15 3:44 | Golovinc2002

# Люблю Тарабарову

http://p90321by.bget.ru/
Спасибо за внимание! Любимые мои!!!
2016/03/15 4:13 | Entino1951

# Алексей, по вашей задумке, при откреплении вернётся старая.

http://p90321by.bget.ru/
Спасибо за внимание! Любимые мои!!!
2016/03/15 4:57 | koFellinif1972

コメントの投稿

タイトル  
名前  
URL
コメント