我在制作嵌入在C ++代码中的ruby脚本时遇到了麻烦。我注意到,当程序运行一段时间后,ruby脚本会出现分段错误。经过一些实验,我将这个问题追溯到垃圾收集器。当程序分配足够的内存以便需要调用垃圾收集器时,它会触发此段错误。 GC.start可以实现相同的结果。禁用垃圾收集修复了这个问题,但是运行它是很重要的,所以我不能像这样禁用它。这是一个已知的错误,还是我的代码出了问题?
这是c ++代码
#include <ruby.h>
int main()
{
//Initialize ruby
ruby_init();
ruby_init_loadpath();
//Start main loop in ruby
int status;
rb_load_protect(rb_str_new2("./scripts/main.rb"), 0, &status);
//Handle errors
if (status)
{
VALUE rbError = rb_funcall(rb_gv_get("$!"), rb_intern("message"), 0);
std::cerr << StringValuePtr(rbError) << std::endl;
}
//Terminate ruby interpreter
ruby_finalize();
exit(0);
return 0;
}
这是ruby脚本“main.rb”
begin
running = true
# Main update loop
while (running == true)
var = "foo"
sleep 0.01
end
end
'var =“foo”'语句只是为了证明问题。当这个语句被调用足够多次并且分配了足够的内存时,GC就会启动并且程序崩溃。