通过基于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
和中止信号。
我看到三个可能的答案:
make
调用创建的对象,因此b
将由Go运行时进行垃圾收集。make
调用创建的切片,但不知道切片中包含的C.uchar
。因此,我们需要遍历切片,并释放每个项目b
。我的结论中有哪些是正确的?否则实际发生了什么?
答案 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。