gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:46:56 26 4
gpt4 key购买 nike

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

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

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

在我看来,我们当前的解决方案是 hacky,并希望从已经做过类似事情的人那里获得一些意见。

除了直接调用手动方法之外,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 的主要设计目标之一是将魔法保持在最低限度,而在对象生命周期事件(构造函数和析构函数)上自动调用的函数是他们回避的魔法之一。

关于用于 C/C++ 绑定(bind)的 Golang 对象析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51319889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com