Arrays Will Go GC试图释放一个;“外部堆”;是否从reflect.SliceHeader结构中的不安全.Pointer?
因此,我发现了如何从Go中的不安全指针创建切片:Arrays Will Go GC试图释放一个;“外部堆”;是否从reflect.SliceHeader结构中的不安全.Pointer?,arrays,go,garbage-collection,cgo,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(ar
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 APIlock
和unlock
之间的array unsafe.Pointer
处访问堆内存
GC最终将尝试收集片列表[]字节。
问题是:切片头在golang分配的堆中,但是sliceHeader.Data
不是
在这种情况下,GC是否足够聪明,可以像大多数其他情况一样忽略none-golang堆分配
调用unlock
后,我想确保Go-GC不会尝试在sliceHeader.Data
处释放heap memeory
另外,如果我想复制数据以便在锁定
/解锁
期间之外使用,我假设可以返回此变量:
var safeList []byte = list[:]
我从未对GC进行过太多的专门讨论,因为它与cgo有关,但请注意,片头和底层数组是两个完全独立的内存分配。切片头可以并且经常是GC的,而不需要底层数组被GC的,因为该数组仍然在其他地方被引用。因此,没有理由仅仅因为切片头是空的,就期望底层数据一定是GC的。还值得注意的是,在这种情况下,切片头几乎肯定是在堆栈上分配的,因为它是作为副本返回的(即不是作为*[]字节
)。