go - GC 收集时释放 C 指针

标签 go

我有一个与 C 库接口(interface)的包。现在我需要在 Go 结构中存储指向 C 结构的指针

type A struct {
  s *C.struct_b
}

显然,在 GC 收集该结构之前,需要释放该指针。我怎样才能做到这一点?

最佳答案

最好的办法是尽可能将 C 结构复制到受控内存中。

var ns C.struct_b
ns = *A.s
A.s = &ns

显然,这并非在所有情况下都有效。 C.struct_b 可能太复杂或与仍在 C 代码中的东西共享。在这种情况下,您需要创建一个 .Free() 或 .Close() 方法(以更有意义的为准)并记录您的结构的用户必须调用它。在 Go 中,Free 方法应该始终可以安全调用。例如free运行后,一定要设置A.s = nil,这样即使用户调用Free两次,程序也不会崩溃。

还有一种方法可以创建终结器。看我写的另一个答案here .然而,它们可能并不总是运行,如果垃圾创建得足够快,垃圾的创建速度很可能会超过收集速度。这应被视为对 Free/Close 方法的补充,而不是替代。

关于go - GC 收集时释放 C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651526/

相关文章:

templates - 用于源和目标打印的 Golang 模板

go - 通过client-go在端口转发中升级连接错误

google-app-engine - 我将如何在 Go 中的 App Engine 上实现一对多?

go - 如何从一个测试包中导出数据并在另一个测试包中使用它们

go - 如何在 Go 中将 [Size]byte 转换为字符串?

go - 简单的负载均衡器无法正常工作

json - 在Go中将类似JSON的字符串转换为struct

Go 中的 JSON 解码器在 UTF-8 中解码字符串错误

google-app-engine - 如何管理我的谷歌应用引擎(使用 golang)的帐户?

go - 从哪里获取数据库查询的上下文?