[csharpll:0317] Re: <教> リソース開放のタイミング

Subject:
[csharpll:0317] Re: <教> リソース開放のタイミング
From:
S.Ono <shuji_ono@...>
Date:
Mon, 20 Mar 2006 15:58:23 +0900
X-Mailer:
Microsoft Outlook Express 6.00.2900.2527
Message-Id:
<020001c64beb$ae7a3480$020ba8c0@magick>
References:
314
小野@どっとねっとふぁん です。

----- Original Message -----
From: "FUKUDA, Fumiki" <fukuda.fm@...>
Subject: [csharpll:0314] <教> リソース開放のタイミング


> すんません、基本的なこと確認させてくださいませ。
> C#では(.NETならなんでもいいけど)、メモリの開放はガベコレ時に
> 行われますけど、メモリ以外のリソースは何時開放されるんでしょか?

実際には実装依存、、、だっけかな?

> こんなとき、ファイルがクローズされるのは何時なんでしょか?
> デストラクタ内で後始末(Close)してるなら、
> ガベコレ直前にデストラクタが動いて…ことになるんすか?
>
> 裏を返せばガベコレなんて何時動くかわかったもんじゃないから、
> 確実にClose()したいなら明示的にClose()を呼べ。ってことでしょか。
>
> あるいはデストラクタ内でCloseしてるんなら、using(...)で囲んで
> おけばスコープ外れるときにDisposeされ、そこでデストラクタが呼ばれて
> めでたくCloseなのかな?

お作法としては、Disposeにリソースを開放する処理を書いて
おきましょう、だったと思います。
で、usingで囲んだときは、スコープを外れるとDisposeが呼ばれるので
そこでリソースの開放が行われるようになる、と。
それと、GCがメモリを回収する際、Disposeが存在しているものに
ついてはまずDisposeを呼ぶという実装がなされているので、GCで
回収されるときもリソースの回収はおこなわれるはず。

#ただし、このとき一回めのGCではDisposeが呼ばれるだけなので
 インスタンス自体は残っちゃうんだったよーな。

このあたりについては「プログラミング Microsoft .NET Framework」に
詳しく書いてあったと思います。

Closeに関しては特にこの手のお作法がなかったよーな。
まぁ、普通Closeなんてメソッドつくればそこでリソースの開放は
するんでしょうけど。

> いや、Javaのときも感じたんだけど、
> 「ガベコレあるから散らかしっぱなしにできて楽ちん」
> ってのは"うそっぱち"ですよね? 少なくともメモリ以外のリソース
> を使ったんならプログラマが責任もってお片づけしたらんと。

Disposeのお作法どおりにつくられてるならGC時点での回収は
保障されるので、気にしなくても一応は動くはず、というレベルですね。
Disposeが実装されてるものはなんでもかんでもusing使え、というのが
あったよーな。。。

----------------------------------------
  小野@どっとねっとふぁん でした。
   http://dotnetfan.org/
----------------------------------------

スレッド

Navigation

検索

[検索ヘルプ]

Maintener: Tietew <www.tietew.jp>
Powered by Ruby on Rails, Mongrel, PostgreSQL, and Hyper Estraier.
click here