【问题标题】:Free C pointer when collected by GCGC 收集时释放 C 指针
【发布时间】:2013-02-02 03:49:59
【问题描述】:

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

type A struct {
  s *C.struct_b
}

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

【问题讨论】:

    标签: go


    【解决方案1】:

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

    【讨论】:

    • 不,只是创建了很少的实例。我想我会使用终结器方法,因为结构是不透明的(从库中导入),我不知道它有多复杂。
    • 我建议您提供一个 .Free() 方法,并尽可能使用它。正如我所说,终结器是备份,它们不应该是你唯一依赖的东西。
    • 是的,我就是这样做的。我有一个Destroy() 方法并使用终结器作为备份。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多