duanliao6789 2018-09-09 16:27
浏览 144

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

So I found out how to create a slice from an unsafe pointer in 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
}

I have a window of opportunity to access the heap memory at array unsafe.Pointer between calling the external C API lock and unlock.

The GC will eventually attempt to collect the slice list []byte. The thing is: the slice header is in golang allocated heap, but the sliceHeader.Data is not.

Is the GC smart enough to ignore none-golang heap allocation in that situation, as in most others?

After calling unlock, I want to be sure that Go GC doesn't attempt to release the heap memeory at sliceHeader.Data.

Also if I want to copy the data for use outside of the lock/unlock period, I assume I could return this var instead:

 var safeList []byte = list[:]
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 R语言Rstudio突然无法启动
    • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
    • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
    • ¥15 用windows做服务的同志有吗
    • ¥60 求一个简单的网页(标签-安全|关键词-上传)
    • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
    • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值