亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

Disposeパターンにおけるオブジェクトのライフサイクルはこういうことかな??

さてさて、昨日ほっぽり出したDisposeパターンです。とはいえ機能紹介したMSDNのサンプルコードはFinalizerが入ってませんので、どうも例としてイマイチな気がします。というわけで非常にすっきりまとまっているid:okazukiさんのサンプルを引っ張ってきます。

d:id:okazuki:20070526:1180152665 :(Disposeパターン @かずきのBlog)


結局Disposeパターンのポイントは以下の2つです。

  1. Disposeメソッド内ではマネージドなリソースもアンマネージドなリソースも両方解放する
    • ついでにファイナイライザ呼び出しを抑制する
  2. デストラクタ内ではアンマネージドなリソースのみ解放する

さて、ではなぜFinalizerではマネージドなリソースは開放しなくていいんでしょうか??ちょっとシーケンス図で考えてみましょう。まずはDisposeを使うとき。
f:id:posaunehm:20120109234240p:image

これはすごく標準的な動作ですね。普通につかったものを片付けているだけ、と行った風情です。そいではDisposeが呼ばれない場合はどうなるのか?まずは、片付けるのが呼び出し元プログラムではなくガベージコレクタになります。そしてガベージコレクタが片付けられるということは、すでに子供のマネージドなオブジェクトは破棄済みということです。つまり。
f:id:posaunehm:20120109234936p:image


この通り、デストラクタ内でマネージドなオブジェクトの解放は不要になります。誰が解放役をやるのかを理解すれば理屈でも理解できますね。こういうことでよいのかな???