かんだ@楓街です。
% ここんとこ、どの ruby ML も流量が少ないですね

  Data_Wrap_Struct() で C構造体を持つオブジェクトを作ります。
  ここで、同じC構造体を持つ別の Ruby Object を生成した場合、一方の参照が消
えたら、そのオブジェクトはもう一方の状態に関係なく GC されると思います。
  この場合、同様にチェック無く free に指定した関数まで呼ばれますか?


  たとえばこんなコードは buggy?

  void *fooptr;

  VALUE foo(VALUE self) {
    if (fooptr == NULL)
      fooptr = malloc(100);

    return Data_Wrap_Struct(cFoo, 0, free, fooptr);
    /* malloc と free の呼び出しはスレッドセーフと考えてください:-) */
  }

  void Init_Foo() {
    cFoo = rb_define_class("Foo", rb_cObject);

    rb_define_method(cFoo, "foo", foo, 0);
  }

  a = Foo::new()
  b = Foo::new()
  a = nil
  GC.start
  b = nil
  GC.start

  ためしてみればいいんだけれど、GC.start で必ず a の GC が起きるのかチェッ
クするのが面倒で(^^;