我有一个与C库接口的包。现在我需要在Go结构
中存储一个指向C结构的指针type A struct {
s *C.struct_b
}
显然,在GC收集结构之前,需要释放此指针。我怎么能做到这一点?
答案 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。但是,它们可能并不总是运行,如果垃圾创建得足够快,垃圾的创建很可能会超速收集。这应被视为具有免费/关闭方法而非替代方法的补充。