登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-10 17:36:35 293浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《用于 C/C++ 绑定的 Golang 对象析构函数》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我们正在使用 c/c++ 构建加密库,现在还添加了对其的 golang 支持。 cgo 绑定工作正常,除了一件事我们需要调用一些函数来手动从内存中释放 c 指针。 目前我们正在这样做,通过制作一些 go 接口包装器来清理内存。

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

当 golang gc 尝试清理包装对象时,我们还尝试使用 runtime.setfinilizer 来清理内存。但事实证明 runtime.setfinilizer 回调并不是每次都运行,或者根本不运行,因为在文档中它说它最终会运行

从我的角度来看,我们当前的解决方案很糟糕,并且希望从已经做过类似事情的人那里获得一些意见。

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


解决方案


go 中处理超出范围的内容的约定是使用 defer(),就像您所做的那样。

还有另一种使用 close() 作为处置方法的约定,实际上库的许多部分都采用此约定(例如 Closer)。

func doThings() {
    if thing, err := openThingHoldingResources(); err != nil {
        // TODO: Handle error
    }
    defer thing.Close()

    // TODO: Do stuff with thing
}

go 的主要设计目标之一是将魔法保持在最低限度,而在对象生命周期事件(构造函数和析构函数)上自动调用的函数是他们回避的魔法之一。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>