最近在 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安全教育手抄报.Pointerunsafe.Point工商银行e安全教育手抄报r 间的赋值一定是安全的,可是直接的赋值(比方同过 uintptr)可能是不合法的,由于 uintptr 不被枸杞认为持有了政策。


go 会忽视一切非 go 分配的政策(比方 C.malloc),所以假定在 C 中有一个指针指向的地址包含了 go 的政策,那么有必要确保这个指针在 go 中也被一个政策安全期计算器存储下来。