GC收集时的自由C指针

时间:2013-02-01 17:12:38

标签: go

我有一个与C库接口的包。现在我需要在Go结构

中存储一个指向C结构的指针
type A struct {
  s *C.struct_b
}

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

1 个答案:

答案 0 :(得分:6)

最好的办法是尽可能将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。但是,它们可能并不总是运行,如果垃圾创建得足够快,垃圾的创建很可能会超速收集。这应被视为具有免费/关闭方法而非替代方法的补充。