我正在尝试将一些glib函数绑定到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_*函数创建的对象会引入内存泄漏问题:这些对象永远不会被垃圾回收。
在Crystal中,是否有可能让glib和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_malloc
和g_free
函数,但是它不能正常工作:它会出现分段错误。有什么想法可以让glib与GC一起使用吗? 我找到了一个相关的问题,但它没有帮助我:Garbage collection with glib? 提前感谢。