Ruby扩展代码中的段错误

Segfault in Ruby Extension Code

本文关键字:错误 段错误 扩展 代码 Ruby      更新时间:2023-10-16

我正在用C/c++编写一个小的Ruby扩展,使boost::dynamic_bitfield在Ruby中可用。我的代码确实完美编译,但是当加载扩展并试图实例化类时,我得到了一个段错误。

我还没有能够正确地利用gdb找到错误或它正在发生的地方。我想我把问题缩小到Init_bitfieldbf_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

解决方案是添加:

new(bf) BitField();

BitFieldNew(大小);初始化struct和boost::dynamic_bitset