in golang, are unsafe.Pointer()s reference counted?

stu*_*stu 5 unsafe-pointers go

Are unsafe.Pointer()s reference counted and thus protected from being garbage collected?

例如,如果我有一个字符串,则它在作用域内时存在,如果我有一个 *string,则当指针在作用域内时该字符串存在,但如果我有一个 unsafe.Pointer(&s) (其中 s 是一个字符串)或者其他什么)只要不安全指针仍然指向它,s就会留在范围内吗?

我发现谷歌说一旦你转换为 uintptr ,它绝对不是,因为 uintptr 只是一个 int ,但我找不到任何关于 unsafe.Pointer() 的明确的方式或另一种方式,可能是因为答案很明显,但我我不太确定,因为我找不到任何可以准确解释的内容。

如果我将 unsafe.Pointer 转换为其他指针类型,我认为这不会改变什么?

Nic*_*sky 4

unsafe.Pointer 防止被指向对象被收集。

\n

此外,Golang 使用跟踪垃圾收集器,而不是引用计数。

\n

这没有明确拼写,但可以从https://pkg.go.dev/unsafe#Pointer推断出来

\n

该文档介绍了一些被认为是安全的 unsafe.Pointer 使用模式。特别是,从 T1* 到指针 T2* 的转换是有效的,前提是 T2 不大于 T1 并且类型具有 \xe2\x80\x9c 等效内存布局\xe2\x80\x9d。

\n

因此,从 T* 到 unsafe.Pointer 以及返回到 T* 的转换是安全的,没有任何限制。如果 unsafe.Pointer 不会阻止引用的对象被收集,那么它就不会安全。

\n