Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Will Go GC试图释放一个;“外部堆”;是否从reflect.SliceHeader结构中的不安全.Pointer?_Arrays_Go_Garbage Collection_Cgo - Fatal编程技术网

Arrays Will Go GC试图释放一个;“外部堆”;是否从reflect.SliceHeader结构中的不安全.Pointer?

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

因此,我发现了如何从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
lock
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的。还值得注意的是,在这种情况下,切片头几乎肯定是在堆栈上分配的,因为它是作为副本返回的(即不是作为
*[]字节
)。