主要观点:在为[Harfbuzz]做 Guile 绑定时,意识到难以将垃圾回收(GC)与显式所有权结合。以 LuaJIT 为例,获取 Harfbuzz 的 blob 并获取其数据时,尽管代码看似正确,但在 hb_blob_get_data 调用后到其他操作之间,GC 可能运行,若后续不再使用 blob 则可能被回收,导致访问无效内存。在有 GC 和终结器的程序中容易出现段错误,所有有 GC 的语言都存在此问题,仅有两种解决方法但都不理想,一种是深入了解编译器和运行时的行为,另一种是手动扩展可终结对象的生命周期,后者的形式是“记住这个”的程序,但未来不一定有效。从另一个角度看,一旦系统工作,要么不更新编译器和运行时,要么与维护 GC 和编译器的人成为好友。关于此话题,Hans Boehm 有相关论述。
关键信息:
- Harfbuzz 中的 blob 是字节的引用计数序列。
- 在 LuaJIT 中定义了获取 blob 数据的包装函数和释放 blob 的函数。
- 存在 GC 运行导致获取的 blob 数据无效的风险。
- 有两种解决办法但都不完美。
- 可参考 Hans Boehm 的相关论述。
重要细节:
- 给出了具体的函数定义,如 hb_blob_get_data、hb_blob_destroy 等。
- 说明了在 LuaJIT 中获取 blob 数据及可能出现的问题。
- 提及其他有 GC 的语言也存在相同问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。