释放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代码



    请参阅。

    如果调用C
    alloc
    函数,则调用
    free
    。您没有
    malloc
    任何东西,因此您没有呼叫
    免费
    谢谢,这为我澄清了这一点!
    s := C.CString(l)
    defer C.free(unsafe.Pointer(s))