3

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

type A struct {
  s *C.struct_b
}

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

4

1 回答 1

6

最好的办法是尽可能将 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 方法的补充,而不是替代。

于 2013-02-01T18:15:48.860 回答