我们正在使用C / C ++构建密码库,现在还为其添加了Golang支持。 CGO绑定可以正常工作,除了一件事我们需要调用一些函数来从内存中手动释放C指针。 当前,我们通过制作一些Go接口包装器来清理内存来做到这一点。
func SomeFunc() {
cObj := NewObjectFromCPP()
defer cObj.Free()
}
当Golang GC尝试清除包装的对象时,我们还尝试使用runtime.SetFinilizer
清除内存。但是事实证明runtime.SetFinilizer
回调不是每次都运行,或者根本没有运行,因为在文档中它说它将最终运行。
从我的角度来看,我们当前的解决方案是不可靠的,并且希望从已经做过这样的事情的人那里得到一些意见。
除了直接调用手动方法之外,从Go清除C / C ++内存的正确方法是什么?
答案 0 :(得分:0)
在Go中处理超出范围的事物的约定是在执行操作时使用defer()。
使用Close()作为处置方法还有另一种约定,实际上,库的许多部分都采用了这种约定(例如Closer)。
func doThings() {
if thing, err := openThingHoldingResources(); err != nil {
// TODO: Handle error
}
defer thing.Close()
// TODO: Do stuff with thing
}
Go的主要设计目标之一是将魔力保持在最低水平,而在对象生命周期事件(构造函数和析构函数)上自动调用的功能就是它们回避的魔力之一。