立石です。

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>