首页 > 解决方案 > CGO:如何释放由 C 数组支持的 go slice

问题描述

CGO Wiki:https ://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices 这解释了如何将 c 数组转换为 go 切片(不复制原始数据)和它还做了一个声明:“重要的是要记住,Go 垃圾收集器不会与这些数据交互,并且如果它从 C 方面释放出来,任何使用切片的 Go 代码的行为都是不确定的。 "

但我的疑问是,在我们使用完这个切片之后,我们如何释放为切片分配的内存?支持 C 数组可以通过适当调用 C 世界来释放,但是切片呢?它会被垃圾收集吗?

还,

slice := (*[1 << 28]C.YourType)(unsafe.Pointer(theCArray))[:length:length]

这个语句会分配一个相当大的数组然后切片吗?我的意思是,它会导致大的内存分配吗?如果是这样,那么大内存将如何以及何时被释放?理解切片将“由 C 数组支持”也令人困惑。如果切片由 C 数组支持,那么为什么[1<<28]需要 BIG 数组?

标签: gocgo

解决方案


推荐阅读