释放C对象的Go结构
当通过基于释放C对象的Go结构,go,cgo,Go,Cgo,当通过基于C.malloc的调用分配单个对象时,我们必须释放新项,因为Go垃圾收集器不知道它们 例如: 然而,当我们创建一个C对象切片时,我们需要释放它们吗 例如: b:=make([]C.uchar,C.int(40)) 我试图使用类似于defer C.free(不安全的.Pointer(&b[0]))的东西,但是它会产生free():无效指针和中止信号 我看到三个可能的答案: Go垃圾收集器知道通过调用make创建的对象,因此b将由Go运行时进行垃圾收集 Go垃圾收集器知道通过make调用创
C.malloc
的调用分配单个对象时,我们必须释放新项,因为Go垃圾收集器不知道它们
例如:
然而,当我们创建一个C对象切片时,我们需要释放它们吗
例如:
b:=make([]C.uchar,C.int(40))
我试图使用类似于defer C.free(不安全的.Pointer(&b[0]))
的东西,但是它会产生free():无效指针和中止信号
我看到三个可能的答案:
Go垃圾收集器知道通过调用make
创建的对象,因此b
将由Go运行时进行垃圾收集
Go垃圾收集器知道通过make
调用创建的切片,但不知道切片中包含的C.uchar
s。因此,我们需要遍历切片,并释放每个项目
我错误地调用了片b
的释放
如果有的话,我的结论中哪一个是正确的?否则实际发生了什么?没有那么复杂
cgo
生成一个Go类型C.uchar
,其内存布局与C
类型无符号字符
完全匹配
Go表达式make([]C.uchar,40)
,通常使用Go类型C.uchar
的底层数组分配Go切片
Go有一个垃圾收集器(GC)。当不再有任何对切片及其底层数组的Go引用时,它就有资格进行Go垃圾收集
Go GC不知道或不关心任何C代码
请参阅。如果调用Calloc
函数,则调用free
。您没有malloc
任何东西,因此您没有呼叫免费
谢谢,这为我澄清了这一点!
s := C.CString(l)
defer C.free(unsafe.Pointer(s))