こんにちは、阿部といいます。

 ruby.h で定義されている ALLOC_N に数 MB 単位でメモリを要求すると、周辺
のメモリが破壊されてしまうようです。わかりにくいかもしれませんが、テスト
に使ったコードを書いておきます。

struct tagTest
{
    int *a;
    int *b;
    int *c;
};
static void test_free ( struct tagTest * t )
{
    ruby_xfree( t->a );
    ruby_xfree( t->b );
    ruby_xfree( t->c );
    ruby_xfree( t );
}
static VALUE test ( VALUE klass )
{
    struct tagTest *t;
    VALUE  v;
    
    v = Data_Make_Struct( rb_cData, struct tagTest, NULL, test_free, t );
    t->a = t->c = NULL;
    t->b = ALLOC_N( int, 1024 * 1024 * 5 );
    fprintf( stderr, "a=%p,b=%p,c=%p\n", t->a, t->b, t->c );
    
    return Qnil;
}
static VALUE test2 ( VALUE klass )
{
    struct tagTest *t;
    VALUE  v;
    
    v = Data_Make_Struct( rb_cData, struct tagTest, NULL, test_free, t );
    t->a = t->c = NULL;
    t->b = (int *)malloc( sizeof(int) * 1024 * 1024 * 5 );
    fprintf( stderr, "a=%p,b=%p,c=%p\n", t->a, t->b, t->c );
    
    return Qnil;
}

(実行結果)
a=0xa078228,b=0xa100260,c=0x10 (test)
a=0x0,b=0xb5002c8,c=0x0 (test2)

 add_heap() あたりがおかしいのかと思いますが、ちょっと、パッチを書ける
ほどまで動作を理解できていません…。
 実行環境は Windows2000 SP2 で、Ruby のバージョンは以下の通りです。

$ ruby --version
ruby 1.6.5 (2001-11-08) [i386-cygwin]

# 1.6.6 も gc.c が変わっていなかったので同じになるかと思いますが…
--------
Black / 阿部 茂
Homepage  :  http://homepage1.nifty.com/blackpoint/
  e-mail  :  shiger-a / nifty.com            (@nifty)