gpt4 book ai didi

garbage-collection - 将 glib 绑定(bind)​​到 Crystal lang(GC 问题)

转载 作者:行者123 更新时间:2023-12-01 04:58:14 28 4
gpt4 key购买 nike

我正在尝试将 glib 中的一些函数绑定(bind)到 Crystal 中。我已经这样做了,它的工作原理:

@[Link("glib-2.0")]
lib LibG
fun g_utf8_strup(str : UInt8*, len : UInt32) : UInt8*
fun g_utf8_strdown(str : UInt8*, len : UInt32) : UInt8*
end

但是它引入了内存泄漏:使用 g_* 函数创建的对象永远不会被垃圾收集。

是否有可能使 glib 在 Crystal 中与 Boehm GC 一起玩得很好?灵感来自 PCRE ,我试过这个:
@[Link("glib-2.0")]
lib LibG
# These 2 functions work perfectly
fun g_utf8_strup(str : UInt8*, len : UInt32) : UInt8*
fun g_utf8_strdown(str : UInt8*, len : UInt32) : UInt8*

alias Malloc = LibC::SizeT -> Void*
alias Free = Void* ->
$g_malloc : Malloc
$g_free : Free
end

# At this point happens segmentation fault
LibG.g_malloc = ->GC.malloc(LibC::SizeT)
LibG.g_free = ->GC.free(Void*)

希望覆盖/重新定义 g_mallocg_free职能。
但它不起作用:它因段错误而失败。

任何想法如何让 glib 与 GC 一起玩?
我发现了某种相关的问题,但它没有帮助我: Garbage collection with glib?

提前感谢。

最佳答案

我建议使用 gobject-introspection以此目的。它为每个库提供了一个 .GIR 文件,该文件是一个大型 XML 文件,描述了库中每个函数、类和方法的 API,以及如何为每个输入和输出参数处理内存。您可以使用它为 GLib 等库动态生成绑定(bind)。

它还提供了一个广泛的单元测试库,您可以使用它来检查您的绑定(bind)是否正常工作。

至于内存管理,重写g_malloc好像是自找麻烦。和 g_free .它在 JavaScript 的 gobject-introspection 绑定(bind)中完成的等效方法是始终确保 JS 环境拥有内存。例如,对于从 C 函数返回的字符串;如果返回字符串的所有权授予调用者,则从返回的字符串(复制字符串)创建一个 JS 字符串,并释放返回的字符串。如果库保留返回字符串的所有权,则创建一个 JS 字符串并且不释放返回的字符串。在这两种情况下,唯一使用的内存都归 JS 环境所有,并受 JS 的垃圾收集器支配。

GLib 对象是另一回事,因为它们是引用计数的,因此 JS 包装器对象可以简单地保存对它们的引用;当 JS 对象被 GC 时,它会释放它的引用,并且如果没有其他 JS 对象持有它,C 对象也会被销毁。

关于garbage-collection - 将 glib 绑定(bind)​​到 Crystal lang(GC 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304158/

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