- - PR -
GC.SuppressFinalize()メソッドについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-04 02:21
初歩的な質問なのですが、
あるインスタンスを破棄する時にGC.SuppressFinalize()メソッドを呼び出して、ガベージコレクション時にファイナライザ(デストラクタ)が呼ばれないようにした場合、このインスタンスのメモリは普通に解放されるのでしょうか? GC.SuppressFinalize()メソッドの意味合いとしては、ガベージコレクションによってメモリは解放されるが、ファイナライザが呼ばれないだけと考えてよいのでしょうか? よろしくお願いします。 | ||||||||
|
投稿日時: 2007-06-04 08:38
IDisposable.Disposeなんかが実装しているオブジェクトってのはDIsposeの中で済ませてしまえばファイナライザは不要だよな?
そういう時に使うんだと仮定して考えてみたら? | ||||||||
|
投稿日時: 2007-06-04 12:04
回答有難うございます。
>IDisposable.Disposeなんかが実装しているオブジェクトってのはDIsposeの中で済ませ>てしまえばファイナライザは不要だよな? 確かに不要ですね。ただ私が思ったのは、ファイナライザが呼ばれないと、ガベージコレクタが、不要になったこのオブジェクトのメモリを解放してくれないのかなということです。 | ||||||||
|
投稿日時: 2007-06-04 12:33
ファイナライザがメモリの解放をしているわけではなく、メモリを解放する時(直前?)に呼ばれるだけです。
| ||||||||
|
投稿日時: 2007-06-04 12:45
回答有難うございます。
結論的には、ちゃんと解放してくれるけれども解放の直前に呼び出すファイナライザは呼び出さないようにするだけと考えてよろしいのですね。 有難うございました。 ちなみに、不要になったあるオブジェクトのメモリがガベージコレクションによって解放されたのを確認できるデバッグツールってあるのでしょうか?ファイナライザが呼ばれる時はデストラクタにブレークポイントなどの仕掛けをしておけば分かると思いますが、実際にそのメモリアドレスが、解放された、まだされていないの確認ができれば安心だと思いまして。 | ||||||||
|
投稿日時: 2007-06-04 12:58
厳密には、CLR はファイナライザを呼び出すキューを管理しているので、GC.SuppressFinalize() を呼び出すと、そのキューから削除するというのが正しい挙動かと思います。
普通は気にする事ではないのですが、CLR プロファイラというツールがあります。Microsoft ダウンロードセンターから最新版をダウンロードして下さい。 http://www.microsoft.com/japan/msdn/enterprise/pag/scalenethowto13.aspx _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2007-06-04 13:11
有難うございます。
理解できました。 実証を得るために、「CLR プロファイラ」使用してみたいと思います。 みなさん、有難うございました。 | ||||||||
|
投稿日時: 2007-06-04 14:19
どのようじゃ目的を持っているのか分からないですが、GC.SuppressFinalize()の話からスレッドが始まっていることを考えると、 「メモリが解放されたことを確認したいが、ファイナライザが実行されたという事象によって確認しようとしてもGC.SuppressFinalize()によって解放されたタイミングで実行されないされないことがあるので、他のメモリ解放の確認方法はないか。」 といったことでしょうか。 もしそうなら「弱い参照」を使うというのはどうでしょうか。 弱い参照は、参照しているオブジェクトがGCの対象になることを妨げません。 そして、参照しているオブジェクトがGCによりメモリが解放されるとそれが分かります。 WeakReferenceというクラスを使ってみてください。 |