【发布时间】:2016-03-31 21:26:32
【问题描述】:
我在使用 cgo 的 Go 中有以下代码:
func foo() {
bar := new(C.struct_bar)
...
}
函数完成执行后是否会对 bar 进行垃圾回收,或者我需要显式调用 free?
【问题讨论】:
标签: memory-management go cgo
我在使用 cgo 的 Go 中有以下代码:
func foo() {
bar := new(C.struct_bar)
...
}
函数完成执行后是否会对 bar 进行垃圾回收,或者我需要显式调用 free?
【问题讨论】:
标签: memory-management go cgo
是的,虽然struct_bar是C类型,但内存是Go分配的,Go会回收的。
然而,在 C 中分配的任何内存都不会被 Go GC 跟踪。 C 代码应该自己管理它,但在像 C.CString 这样 Go 触发分配的情况下,您必须使用 C.free 手动释放内存。
【讨论】:
new(C.char) 分配一个字节,稍后将由 GC 收集。如果 C 函数要分配内存,不要在 go 中分配任何东西,只需传入一个指针即可。