用于C / C ++绑定的Golang对象析构函数

时间:2018-07-13 07:31:05

标签: go cgo

我们正在使用C / C ++构建密码库,现在还为其添加了Golang支持。 CGO绑定可以正常工作,除了一件事我们需要调用一些函数来从内存中手动释放C指针。 当前,我们通过制作一些Go接口包装器来清理内存来做到这一点。

func SomeFunc() {
  cObj := NewObjectFromCPP()
  defer cObj.Free()
}

当Golang GC尝试清除包装的对象时,我们还尝试使用runtime.SetFinilizer清除内存。但是事实证明runtime.SetFinilizer回调不是每次都运行,或者根本没有运行,因为在文档中它说它将最终运行

从我的角度来看,我们当前的解决方案是不可靠的,并且希望从已经做过这样的事情的人那里得到一些意见。

除了直接调用手动方法之外,从Go清除C / C ++内存的正确方法是什么?

1 个答案:

答案 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的主要设计目标之一是将魔力保持在最低水平,而在对象生命周期事件(构造函数和析构函数)上自动调用的功能就是它们回避的魔力之一。