cgo中的垃圾收集

use*_*276 2 memory-management go cgo

我在使用 cgo 的 Go 中有以下代码:

  func foo() {
       bar := new(C.struct_bar)
       ...
  }
Run Code Online (Sandbox Code Playgroud)

函数完成执行后 bar 会被垃圾回收还是我需要显式调用 free?

Jim*_*imB 5

是的,虽然struct_bar是 C 类型,但是内存是由 Go 分配的,会被 Go 收集。

然而,在 C 中分配的任何内存都不会被 Go GC 跟踪。C 代码应该自己管理它,但是在C.CStringGo 触发分配的情况下,您必须手动释放内存C.free

  • @user2424276:`new(C.char)` 分配一个字节,稍后将由 GC 收集。如果 C 函数要分配内存,则不要在 go 中分配任何内容,只需传入一个指针即可。 (3认同)