まつもと ゆきひろです
In message "[ruby-list:3066] about GC"
on 97/06/02, MAEDA Shugo <shugo / po.aianet.ne.jp> writes:
|
|前田です。
|
|Cの構造体にrubyのオブジェクトを持たせている
|のですが、GCの時にトラブルが起きるような気が
|します。
具体的にどういうトラブルか教えていただけませんか?
開放されてはいけないオブジェクトが開放される?
オブジェクトが開放されない?
|README.EXTにCの大域変数はrb_global_variable
|でrubyに教えてあげるように、とありますが、
|rb_global_variableを呼べば、そのオブジェクト
|はGCでfreeしなくなるということでしょうか?
rb_global_variable()で指定された変数が指しているオブジェクト
が「生きている」とみなされます.rb_global_variable()で指定す
るのはオブジェクトではなく,変数であることに注目してください.
|また、その場合、明示的にオブジェクトを破棄
|するにはどうすればよいのでしょう?
|obj_freeを呼んでしまっていいんでしょうか?
いけません.どこからも参照されなくなったオブジェクトは自動的
に開放されます.rubyではユーザによる明示的なrubyオブジェクト
の削除を許していません.
もうちょっとGCについてまとめておくと
ルートから参照できるオブジェクトと,そのオブジェクトから間
接的に参照できるオブジェクトは「生きている」.
「生きている」オブジェクト以外のオブジェクトは開放される.
ルートとはrubyの変数,Cのスタック,rb_global_variable()で
指定されたCの大域変数である.
Dataが開放される時には生成時に指定したfree関数が呼ばれる
です.
まつもと ゆきひろ /:|)