立石です。 Date: Thu, 29 Jul 1999 18:29:15 +0900 From: "Dai.K." <MAP2303 / mapletown.net> MAP2303> Data_Wrap_Struct() で C構造体を持つオブジェクトを作ります。 MAP2303> ここで、同じC構造体を持つ別の Ruby Object を生成した場合、一方の参照が消 MAP2303> えたら、そのオブジェクトはもう一方の状態に関係なく GC されると思います。 MAP2303> この場合、同様にチェック無く free に指定した関数まで呼ばれますか? こういうコードを試してみてはどうでしょうか? #include <stdio.h> #include <ruby.h> VALUE cFoo; void *fooptr; void myfree(void *ptr) { printf("myfree is called."); if( fooptr ){ free(fooptr); fooptr = NULL; }; }; VALUE rb_foo_foo(VALUE self) { VALUE value; printf("foo is called\n"); if (fooptr == NULL) fooptr = malloc(100); value = Data_Wrap_Struct(cFoo, 0, myfree, fooptr); return value; }; void Init_Foo() { fooptr = NULL; cFoo = rb_define_class("Foo", rb_cObject); rb_define_method(cFoo, "foo", rb_foo_foo, 0); }; Takaaki Tateishi <ttate / jaist.ac.jp>