我有一个与 C 库接口的包。现在我需要在 Go 结构中存储一个指向 C 结构的指针
type A struct {
s *C.struct_b
}
显然,这个指针需要在 GC 收集结构之前释放。我怎样才能做到这一点?
我有一个与 C 库接口的包。现在我需要在 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运行后,一定要设置As=nil,这样如果用户调用Free两次,程序就不会崩溃。
还有一种方法可以创建终结器。请参阅我在这里写的另一个答案。但是,它们可能并不总是运行,如果创建垃圾的速度足够快,那么垃圾的创建很可能会超过收集速度。这应该被认为是对 Free/Close 方法的补充,而不是替代。