所以我发现了如何从Go中的不安全指针创建切片:
func cArray2ByteSlice(array unsafe.Pointer, len int) (list []byte) {
sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&list)))
sliceHeader.Cap = len
sliceHeader.Len = len
sliceHeader.Data = uintptr(array)
return list
}
在调用外部C API array unsafe.Pointer
和lock
之间,我有机会访问unlock
上的堆内存。
GC最终将尝试收集切片list []byte
。
问题是:切片标头位于golang分配的堆中,而sliceHeader.Data
不是。
与大多数其他情况一样,GC是否足够聪明,可以在这种情况下忽略none-golang堆分配?
调用unlock
之后,我想确保Go GC不会尝试释放sliceHeader.Data
处的堆内存。
此外,如果我想复制数据以在lock
/ unlock
期间之外使用,我假设我可以改为返回此var:
var safeList []byte = list[:]