Go GC是否会尝试在reflect.SliceHeader结构中从unsafe.Pointer中释放“外部堆”?

时间:2018-09-09 16:27:31

标签: arrays go garbage-collection cgo

所以我发现了如何从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.Pointerlock之间,我有机会访问unlock上的堆内存。

GC最终将尝试收集切片list []byte。 问题是:切片标头位于golang分配的堆中,而sliceHeader.Data不是。

与大多数其他情况一样,GC是否足够聪明,可以在这种情况下忽略none-golang堆分配?

调用unlock之后,我想确保Go GC不会尝试释放sliceHeader.Data处的堆内存。

此外,如果我想复制数据以在lock / unlock期间之外使用,我假设我可以改为返回此var:

 var safeList []byte = list[:]

0 个答案:

没有答案