none
Disposeについて(返信がうまくできないので新たにスレッドをたてます) RRS feed

  • 質問

  •  

    追加質問です。

    アンマネージなリソースはDisposeで開放されますが

    マネージリソースはガベージコレクションによって処理されるまでは

    開放されないと考えてよろしいですか?

    2008年2月6日 3:45

回答

  • マネージリソースってのは何を念頭に置かれてますか?

     

    ていうかまあ実際にマネージしてるのはオブジェクトが占有するメモリだけなんですけどね。

    2008年2月7日 0:25
  • Dispose()メソッドは、アンマネージなリソース(ファイルオープンやDBとの接続)を開放するメソッドであること。

    と、理解しているのですが。

    Dispose メソッドは,

    「Disposeメソッドを公開しているそのクラス自身が

    クラスメンバとして握っている参照を切る場所」

    です。

    参照を切るだけです。

    それ以上でもそれ以下でもないと考えると楽になるかも。

     

    アンマネジドリソースが解放されるのは,

    そういう実装がしてあるクラスの場合は,そうであって,

    Disposeメソッドは,アンマネジドリソースを開放することを示しているわけではない です。

     

    # そのクラスがアンマネジドリソースを利用していて,

    # 使い終わったら終了処理する必要があるのかないのか?

    # また,そのメソッドがどのメソッドなのか?

    # は,結局,「ドキュメントを読む/に書いておく」 しかないです。

    2008年2月7日 2:58
  • 外池と申します。細かいところまで突っ込まれると私も自信がないのですが・・・、私の頭の中での整理をご紹介しておきます。

     

    まず、マネージリソース「だけ」に注目すれば、まめぞう1118さんのご理解で大丈夫だと思います。最初のスレッドにあった、例えば、String型だけのメンバーしかもっていないオブジェクトに対してDisposeを実装しても、あまり意味はありません。たとえ、String型のメンバーにnull参照を代入してやったとしても、もともとString型のデータで占有されていたメモリーはGCが行われるまではそのままになっています。

     

    次に、アンマネージリソースを用いているオブジェクトについて、.Net Frameworkのクラスライブラリーにもともとはいっているクラスを参考に(手本に)してみると良いと思います。、Disposeメソッドを実装しているクラスは、やはり、Disposeの時点でアンマネージリソースを解放(大抵の場合はメモリーの点でご利益がある)するものと言って良いと思います。

     

    で、

     

    自作のクラスが、Disposeメソッドを実装しているクラスのオブジェクトをメンバーとして保持しているとしましょう。この場合、自作のクラスがアプリの中で不要になった時点で・・・、保持しているオブジェクトをDisposeしてしまいたいですよね? ですので、自作のクラスにもDisposeを実装して、アプリから呼んでもらえるようにするわけです。

     

    2008年2月7日 11:45
  • 参照を切るだけと言うことは、

    参照を切った後も、使用してあったメモリ上には

    以前の情報が残っていて

    あとでガベージコレクションがメモリの開放(クリア)をする。

    という事になりますかね。

     

    残念ながらそういうことですね。

     

     

     

    2008年2月7日 13:16

すべての返信

  • マネージリソースってのは何を念頭に置かれてますか?

     

    ていうかまあ実際にマネージしてるのはオブジェクトが占有するメモリだけなんですけどね。

    2008年2月7日 0:25
  • Dispose()メソッドは、アンマネージなリソース(ファイルオープンやDBとの接続)を開放するメソッドであること。

    と、理解しているのですが。

    Dispose メソッドは,

    「Disposeメソッドを公開しているそのクラス自身が

    クラスメンバとして握っている参照を切る場所」

    です。

    参照を切るだけです。

    それ以上でもそれ以下でもないと考えると楽になるかも。

     

    アンマネジドリソースが解放されるのは,

    そういう実装がしてあるクラスの場合は,そうであって,

    Disposeメソッドは,アンマネジドリソースを開放することを示しているわけではない です。

     

    # そのクラスがアンマネジドリソースを利用していて,

    # 使い終わったら終了処理する必要があるのかないのか?

    # また,そのメソッドがどのメソッドなのか?

    # は,結局,「ドキュメントを読む/に書いておく」 しかないです。

    2008年2月7日 2:58
  •  Hongliang さんからの引用

    マネージリソースってのは何を念頭に置かれてますか?

     

    ていうかまあ実際にマネージしてるのはオブジェクトが占有するメモリだけなんですけどね。

     

    自分的に、マネージリソースは、オブジェクトが占有しているメモリで

    かつ、CLRが管理しているメモリ。

    このマネージリソースが未使用になるとガベージコレクションによって開放される。

     

    で、アンマネージリソースがファイルストリームやDBのコネクション。

     

    と認識してました。

     

    自分の場合は物覚えが悪いので

    何度も読まないと、なかなかちゃんと理解できないのです。

    なので、うまく回答できていないかもしれませんが。。。

    2008年2月7日 3:48
  •  yayadon さんからの引用

    Dispose メソッドは,

    「Disposeメソッドを公開しているそのクラス自身が

    クラスメンバとして握っている参照を切る場所」

    です。

    参照を切るだけです。

    それ以上でもそれ以下でもないと考えると楽になるかも。

     

     

    ありがとうございます。

     

    参照を切るだけと言うことは、

    参照を切った後も、使用してあったメモリ上には

    以前の情報が残っていて

    あとでガベージコレクションがメモリの開放(クリア)をする。

    という事になりますかね。

     

    2008年2月7日 3:53
  • 外池と申します。細かいところまで突っ込まれると私も自信がないのですが・・・、私の頭の中での整理をご紹介しておきます。

     

    まず、マネージリソース「だけ」に注目すれば、まめぞう1118さんのご理解で大丈夫だと思います。最初のスレッドにあった、例えば、String型だけのメンバーしかもっていないオブジェクトに対してDisposeを実装しても、あまり意味はありません。たとえ、String型のメンバーにnull参照を代入してやったとしても、もともとString型のデータで占有されていたメモリーはGCが行われるまではそのままになっています。

     

    次に、アンマネージリソースを用いているオブジェクトについて、.Net Frameworkのクラスライブラリーにもともとはいっているクラスを参考に(手本に)してみると良いと思います。、Disposeメソッドを実装しているクラスは、やはり、Disposeの時点でアンマネージリソースを解放(大抵の場合はメモリーの点でご利益がある)するものと言って良いと思います。

     

    で、

     

    自作のクラスが、Disposeメソッドを実装しているクラスのオブジェクトをメンバーとして保持しているとしましょう。この場合、自作のクラスがアプリの中で不要になった時点で・・・、保持しているオブジェクトをDisposeしてしまいたいですよね? ですので、自作のクラスにもDisposeを実装して、アプリから呼んでもらえるようにするわけです。

     

    2008年2月7日 11:45
  • 参照を切るだけと言うことは、

    参照を切った後も、使用してあったメモリ上には

    以前の情報が残っていて

    あとでガベージコレクションがメモリの開放(クリア)をする。

    という事になりますかね。

     

    残念ながらそういうことですね。

     

     

     

    2008年2月7日 13:16
  •  外池 さんからの引用

     

    自作のクラスが、Disposeメソッドを実装しているクラスのオブジェクトをメンバーとして保持しているとしましょう。この場合、自作のクラスがアプリの中で不要になった時点で・・・、保持しているオブジェクトをDisposeしてしまいたいですよね? ですので、自作のクラスにもDisposeを実装して、アプリから呼んでもらえるようにするわけです。

     

     

    そーです。よーやく理解できるレベルまで達したと思います。

    ありがとうございました。

    2008年2月8日 3:50