我有一个与 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/