まつもと ゆきひろです

In message "[ruby-list:9021] Re: making extension module"
    on 98/08/11, Kikutani Makoto <kikutani / sprintmail.com> writes:

|きくたにです。

|そうそう、これ疑問でして、Data_Make_Struct()の第4引数はやっぱ
|書かないとGCされないからまずいんですよね?

第4引数はDataオブジェクトがGCされるタイミングで呼び出される
関数です.Data_Make_Struct()の場合は構造体がmalloc()されるん
で,指定されないとメモリリークになります.

ここに指定するものは

  * ポインタの後始末をするもの(freeまで行う必要あり)

です.特別な後処理が必要なければfree(3)を指定すれば良いでしょ
う.たとえば dbmモジュールの場合にはdbm_closeが開放まで行っ
てくれるので,明示的なfreeは必要ないでしょう.

|あと第3引数のmarkてのがたいていの例では0になってるので、どういうときに
|必要なのかわかってません。

markってのは,その構造体が別のRubyオブジェクトに対する参照を
含んでいる場合,その参照先がゴミにならないために指定するもの
です.大抵の拡張モジュールはそんなものはないので,その場合に
は指定する必要はありません.

|もどって、「C++ のデストラクタのようなもの」は「いらない」んじゃ
|ないんですか? かってにGCしてくれるから。
|
|# そんなのrubyレベルで書けって言われたら嫌だよな

いやですねえ.でも,どうしても書きたければ,[ruby-list:9026]
に書いたように lib/final.rb を使う方法があります.

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