释放C对象的Go结构

时间:2019-03-03 19:44:17

标签: go cgo

通过基于C.malloc的调用分配单个对象时,我们必须释放新项目,因为Go垃圾回收器不知道这些新项目。

EG:

s := C.CString(l)
defer C.free(unsafe.Pointer(s))

但是,当我们创建一片C对象时,是否需要释放它们?

EG:

b := make([]C.uchar, C.int(40))

我试图使用defer C.free(unsafe.Pointer(&b[0]))之类的东西,但是会产生free(): invalid pointer和中止信号。

我看到三个可能的答案:

  1. Go垃圾收集器知道通过make调用创建的对象,因此b将由Go运行时进行垃圾收集。
  2. Go垃圾回收器知道通过make调用创建的切片,但不知道切片中包含的C.uchar。因此,我们需要遍历切片,并释放每个项目
  3. 我在错误地释放切片b

我的结论中有哪些是正确的?否则实际发生了什么?

1 个答案:

答案 0 :(得分:0)

没有那么复杂。

cgo生成Go类型C.uchar,其内存布局与C类型unsigned char完全匹配。

通常,Go表达式make([]C.uchar, 40)会为Go切片分配一个Go类型为C.uchar的基础数组。

Go有一个垃圾收集器(GC)。如果不再有对切片及其基础数组的Go引用,则可以进行Go垃圾回收。

Go GC不了解或不关心任何C代码。


请参见Go: Command cgo