まつもと ゆきひろです.

In message "[ruby-list:2041] clean up"
    on 97/02/04, Sadayuki Sakamoto <sakamoto / tsc.sjk.kdd.co.jp> writes:
|
|KDDの酒本と申します。
|
|1つ質問させていただきます。
|たとえばテンポラリファイルを作るような(変な)クラスを自分で
|定義したときに、そのオブジェクトが削除されるときに、テンポラリ
|ファイルも削除されるようにするにはどうすればよいのでしょうか?
|それともMake_Data_Struct の free かなにかで行えばよいのでしょうか?
|あるいは、安全のために専用のメソッドで明示的に削除するのが普通
|なのかもしれませんね。
|発想自体が変なのかもしれませんが。

いろいろ考えられるのですが,とりあえず以下の質問について考え
てください.

 (1) その一時ファイルのようなものはオブジェクトと必ず命運をと
     もにする必要がありますか? あるいは特定の処理の間という
     風な限定が出来ますか?

 (2) そのオブジェクトの実装のために拡張モジュールを作る気が
     ありますか? それとも全部 rubyで実装したいですか?

1の答えが「特定の処理の間で構わない」というのでしたら,
ensureを使ってください.

  begin
    ...
  ensure
    system 'rm -f #{一時ファイル}'
  end

とかいう感じになります.しかし,オブジェクトがGCされていなく
なる時にだけ削除したいとなるとちょっと問題です.というのも現
在のrubyではGCされる時に起動される処理(finalizer)はCでしか,
記述できないからです.

これは実はわざとで,finalizerを任意に記述できると,「死んで
いるオブジェクト」を簡単に「生きていること」にできるからです.
そんなことになると「finalizerを起動したばかりにこのオブジェ
クトが死んでいるか生きているかは次回のGCまで分からない」とい
う悲惨な状況が発生します.

これはちょっと避けたい.そこでrubyの現在の仕様ではfinalizeが
必要なものはできるだけ明示的に行うことを推奨しています.Cで
明示的にfinalizerを書いた時にはat your own riskでやってもらっ
ています.

この件に関しては前から「欲しい」という意見も聞くのですが,ま
だ松本は意見を変えていません.

|GCがどのように作用するのかいまだに判っていないのですが、
|
|・オブジェクトをもつ変数が別のオブジェクトを持つように
| 上書きされるようなときにGCにより始末される
|・ローカル変数のスコープを出るときに始末の対象になる
|
|といった感じでよいのでしょうか?

「だれからも参照されなくなった」オブジェクトは「GCが起動され
た時に」回収される.GCは内部に割り当てたオブジェクト用の領域
が足りなくなった時に勝手に呼ばれる.という感じです.参照され
なくなったからといって即座に回収されるわけではありません.

                                まつもと ゆきひろ /:|)