【发布时间】:2016-02-09 23:22:41
【问题描述】:
我正在尝试将 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_* 函数创建的对象永远不会被垃圾回收。
是否有可能使 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_malloc 和 g_free 函数。
但它不起作用:它因分段错误而失败。
任何想法如何让 glib 与 GC 一起玩? 我发现了某种相关的问题,但对我没有帮助:Garbage collection with glib?
提前致谢。
【问题讨论】:
-
还要检查github.com/jhass/crystal-gobject,它已经拥有你似乎正在做的绑定。
-
另外,在你使用它返回给你的指针之后,不要使用 LibG.g_free(ptr) 来获取内存。
-
很高兴知道,谢谢!还没有看到 Crystal-gobject 项目)
标签: garbage-collection glib crystal-lang boehm-gc