投稿数 - 437, コメント - 6250, トラックバック - 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

# pastillas precio mexico

Cuanto cuesta en chile http://farmacia-en-linea.life/eliprim.html sin receta en Argentina.
2018/01/07 10:53 | farmacia-en-linea

# Where to order cheap

Buy generic online usa http://www.hillsidechamber.com:88/UserProfile/tabid/90/UserID/536906/Default.aspx generic over the counter.
2018/01/08 6:43 | to buy in toronto

# Can I buy online uk

Generic lowest price http://www.diroo.com.ar/user/profile/8840 Get online uk.
2018/01/08 15:03 | cost of in usa

# Can I buy in new zealand

purchasing in dubai http://www.ragusassociates.com/?option=com_k2&view=itemlist&task=user&id=66258 buying tablets.
2018/01/08 22:27 | Online canada overnight

# Generic price in usa

cheapest uk http://www.micobiota.cl/?option=com_k2&view=itemlist&task=user&id=39772 best price for.
2018/01/09 5:42 | can you buy online in canada

# Generique sanofi

Generique maroc http://medicamentsonline.life/janumet.html prix France.
2018/01/10 1:14 | MEDICAMENTS ONLINE

# online kopen apotheek

Koop online, http://onlinemedicijnenbestellen.life/ventolin.html , veilig internet.
2018/01/10 3:41 | Medicijnen Bestellen Online

# kosta stockholm

sweden göteborg, http://apotekvarerpanettet.life/tretinoin.html , kapslar billiga.
2018/01/12 1:36 | Apotekvarer Pa Nettet

# priser apoteket priser

snabb leverans göteborg, http://apotekvarerpanettet.life/promethazine.html , köpa billigt göteborg.
2018/01/12 9:00 | apotekvarer-pa-nettet life

# online Norge pris

bestille Sverige, http://apoteknettbutikknorge.life/silvitra.html , kjøpe i Sverige pris.
2018/01/12 12:49 | apoteknettbutikknorge life

# természetes eladó

eladási, http://gyogyszertar-online-hu.life/coumadin.html - Gyógyszertár ára.
2018/01/12 13:27 | Gyogyszertar Hungaria Online

# alternatief belgie

Apotheek belgie online, http://onlineapothekerzonderrecept.life/buspar.html , kopen via internet zonder recept te koop.

# megvesz magyarországon

Alacsony árak, http://gyogyszertaronlinehu.life/propranolol.html - természetes budapest.
2018/01/12 18:37 | Online Gyogyszertar Hungaria

# kosten prijzen

Bestellen paypal recept, http://onlineapothekernederland.life/aldactone.html , kopen zonder recept nederland online.
2018/01/13 1:46 | Online Apotheker Nederland

# generiska alternativ till pris

bestalla online, http://apotekvarerpanettet.life/slimex.html , köpa Sverige recept.
2018/01/13 3:39 | Apotekvarer Pa Nett

# kjøp bergen

apotek Norge København, http://apotek-norway.life/aldactone.html , Generisk Gøteborg.
2018/01/13 4:43 | apotek-norway.life

# köpa sverige danmark

Sverige apotek online, http://apotekvarerpanettet.life/arimidex.html , online recept.
2018/01/13 11:08 | Apotekvarer Pa Nett

# kan man kjøpe uten resept i Norge pris

pris apotek Sverige Danmark, http://apoteknorway.life/precose.html , salg Norge.
2018/01/13 11:46 | Apotek Norway

# eladás eladási árfolyamok

Eladó budapest olcsón, http://online-gyogyszertar.life/hydrochlorothiazide.html - természetes budapest.
2018/01/13 12:26 | Gyogyszertar Online Hungaria

# bästa pris i sverige

bestall köpa, http://apotekvarerpanettet.life/keppra.html , kostar Stockholm.
2018/01/13 17:42 | Sverige Apotek Pa Natet

# billig jeg

beste sted å kjøpe jeg, http://apotek-norge-online.life/synthroid.html , For salg Oslo.
2018/01/13 21:57 | Apotek Online Norge

# kostnaden Gøteborg

bestille bergen, http://apoteknorgeonline.life/trazodone.html , Hvordan kjøpe København.
2018/01/14 6:39 | apoteknorgeonline

# köp pa natet online

malmö billigt, http://apotekvarerpanettet.life/slimex.html , kapslar kostnad.
2018/01/14 7:23 | sverige-apotek-pa-natet life

# generieke bestellen paypal

Kopen apotheek nederland online, http://internetapotheek-nl.life/amoxil.html , kopen zonder recept in nederland belgie.
2018/01/14 13:02 | internet apotheek nl life

# billiga sverige

receptfria online, http://apotekvarerpanettet.life/periactin.html , generisk billigt.
2018/01/14 17:29 | Apotek Pa Natet

# Over the counter date

can i take without a doctor prescription http://www.andersfray.com/blog/?page_name=zyloprim average cost of prescription.
2018/01/14 23:41 | andersfray.com

# Best non prescription

where can i order http://www.jimsbigthings.com/?page_name=anafranil cheapest new zealand.
2018/01/16 3:50 | JIMSBIGTHINGS.COM

# españa generico

Precio en farmacias http://www.gwsisecurity.com/fig/data/farmacia/raloxifene.html onde comprar barato.
2018/01/22 10:02 | GWSISECURITY.COM

# Tabletten ohne rezept bestellen

Preise apotheke osterreich http://blakemarymor.com/DROPBOX/apotheke/ethinyl-estradiol-cyproterone.html pillen online kaufen.
2018/01/22 15:55 | BLAKE

# necesita receta mexico

Precio mas barato http://handledesigns.com/img/farmacia/epamin.html donde puedo comprar sin receta en estados unidos.
2018/01/22 16:14 | handle

# sin receta en argentina

Venta en farmacias ecuador http://highdesertpintohorse.org/machform/data/form_10940/farmacia/fluamar.html receta para.
2018/01/22 22:14 | HIGHDESERTPINTOHORSE.ORG

# Ohne rezepte in apotheke

apotheke preisvergleich http://carlsbadridersco.com/shop/media/apotheke/ogastoro.html online kaufen ohne rezept schweiz.
2018/01/23 0:32 | CARLSBADRIDERSCO

# generico españa farmacia

Donde comprar en tegucigalpa http://www.cypressassistance.org/wp-content/uploads/2017/04/farmacia/lanzap.html donde conseguir en Venezuela.
2018/01/23 3:51 | Cypress

# precio farmacia españa

Sin receta chile http://www.harrison1966.com/gallery/farmacia/flutiamik.html conseguir.
2018/01/23 3:51 | HARRISON CLASS OF 1966

# Online kaufen per paypal

billig kaufen per uberweisung http://chronovalve.com/ezg_data/apotheke/mexalen.html kaufen apotheke preis.
2018/01/23 6:26 | CHRONOVALVE.COM

# Tabletten dosis

preis wien http://danazheng.com/assets/fonts/apotheke/finahair.html online kaufen ohne rezept paypal.
2018/01/23 9:25 | DANAZHENG.COM

# Once preis

preis apotheke osterreich http://skansailclub.com/sites/default/files/color/apotheke/sildenafil.html Online bestellen belgie.
2018/01/23 11:36 | skaneateles

コメントの投稿

タイトル  
名前  
URL
コメント