私は、Boost::dynamic_bitfield を Ruby で使用できるようにする小さな Ruby 拡張機能を C/C++ で作成しています。私のコードは完全にコンパイルされますが、拡張機能をロードしてクラスをインスタンス化しようとすると、segfault が発生します。
gdb を適切に利用して、エラーまたはエラーが発生している場所を見つけることができませんでした。Init_bitfield
問題をor bf_new
/に絞り込んだと思いますbf_init
。
完全なソース: http://pastebin.com/qLkMGYqq
static VALUE bf_new(VALUE self, VALUE size)
{
VALUE argv[1];
Check_Type(size, T_FIXNUM);
BitField *bf = BitFieldNew(NUM2INT(size));
VALUE tdata = Data_Wrap_Struct(self, 0, free, bf);
argv[0] = size;
rb_obj_call_init(tdata, 1, argv);
return tdata;
}
BitField は次のように定義されます。
typedef struct _bitfield {
boost::dynamic_bitset<> data;
} BitField;
コードは主に次の記事から着想を得ています: http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html