最近在 golang 的邮件列表中看到了一篇关于 GC 怎样处理 unsafe.Pointer
的谈论,觉得应当记录一下。
问题 1:假定一个政策只被 unsafe.Pointer
所指向,那么这个政策会被收回么龚俊?
答复 1:不会。假定 unsafe.Pointer
指向了一个政策,那么 go 的 GC 会知道有这个政策,而且不会开释这个政策的安全教育内存。
可是留心,有一个破例:假定宫颈癌疫苗这个政策的内存是公积金借款在 go 外被分配的(比方 C.malloc
),那么以上的规矩不收效。
问题 2:假定这个政策内部也有一些指针,那么 GC 会怎样处理这些指针?
答复 2:假定这个政策是在 go 内部分配的,那么 GC 也会遍历这些指针(也便是不会被开释)。
问题 3:假定在以上两个问题中,政策都不会被安全期是哪几天开释,安全教育手抄报那么 GC 是怎样处理的?unsafe.Pointer
会存政策的类型信息么?
答复 3:不会存类型信息,可是假定政策是在 go 中申请的,那么在对应的内存中是会存有类型信息的;假定没有类型信息,那么 GC 会选用十分保存的战略安全手抄报:遍历整个政策,只需其中有 8bit 的值是合法的内存地址(在栈范围内,或许在堆上),就认为是指针,不会进行收回。
问题 4:有没有一种情况 unsafe.Pointer
会变成不合法的(野指针)?
答复 4:在 go 中,只需 unsafe.Pointer
有一刻是合Go法的,而且它的值没有修改,那么 go 会确保它安全在整个程序的生命周期中都是合法的。在 unsafe安全教育手抄报.Pointer
和 unsafe.Point工商银行e安全教育手抄报r
间的赋值一定是安全的,可是直接的赋值(比方同过 uintptr)可能是不合法的,由于 uintptr 不被枸杞认为持有了政策。
go 会忽视一切非 go 分配的政策(比方 C.malloc),所以假定在 C 中有一个指针指向的地址包含了 go 的政策,那么有必要确保这个指针在 go 中也被一个政策安全期计算器存储下来。