gpt4 book ai didi

c - Ruby 垃圾回收 : Mark non-exported variables

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:08 26 4
gpt4 key购买 nike

我有几个用 Data_Wrap_Struct 绑定(bind)到 ruby​​ 对象的结构,我还提供了 mark() 和 free() 函数。

当我手动启动 GC 或等待它跳入时,我的 ruby​​ 对象被杀死。到目前为止没有什么新鲜事。

奇怪的是:当我尝试使用 rb_gc_register_address() 保护这些对象时,什么也没有发生——我的对象仍然会被杀死。

我只能通过这样的方式来阻止 GC 这样做:

objects = rb_ary_new();
rb_gc_register_address(&objects);
rb_ary_push(objects, data);

这是唯一的方法吗?为什么我不能只使用 rb_gc_register_address()?

最佳答案

看一眼,似乎所有的类型都排成一行(你正在返回 VALUE 并传入 VALUE ptr)所以我的猜测是标记操作没有正确标记对象并且扫描阶段正在抢夺

也许通过将子对象包装在一个具有正确标记函数的数组中可以保护您的数据对象。

这与其说是一个可靠的答案,不如说是一种理论,但也许可以从中着手。 :)

不,具有讽刺意味的是,回到对 Ruby GC 的挖掘有点太深了。希望让一些招聘人员惊叹不已。 :D

-- 编辑--

除此之外,我只是在 gc.c 和第 1098 行上挖掘,你想要失败的精确测试是

if (!(p->as.basic.flags & FL_MARK))

因此,在您的标记函数中执行您必须执行的操作以将其包含在您的标志 FL_MARK 中,这样清扫器就不会...嗯...清扫您。

关于c - Ruby 垃圾回收 : Mark non-exported variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/719438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com