保留引用,但不将数据分配给实际变量是否安全?[已结束]

Is it safe to keep reference, but not assigning data to an actual variable? [closed]

提问人:moo.duwayne 提问时间:8/29/2023 更新时间:8/29/2023 访问量:72

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

3个月前关闭。

我想在切片中保留引用列表,但我无法在线调用任何资源来解释在不分配给变量的情况下保留引用是否安全?

我的意思是,操作系统是否有可能在引用的地址中写入程序员不期望的内容?

下面是一个示例代码:

type ListItem [8]uint64

list := make([]*ListItem, 0)

list = append(list, &ListChunk{})
list = append(list, &ListChunk{})
list = append(list, &ListChunk{})

换句话说,无论运行多长时间,是否保证名为切片中的项在程序运行时保持不变?list

Go 参考 切片

评论

3赞 icza 8/29/2023
将指针保留在某处可确保指向的值不会被垃圾回收。你的 Go 运行时不会随意向它写入任何内容。其他应用在您的操作系统中执行的操作超出了您的应用范围。这让你满意吗?
1赞 Adrian 8/30/2023
如果操作系统任意修改分配给正在运行的程序的内存,则任何软件都无法在该操作系统上运行。
0赞 moo.duwayne 8/30/2023
@icza 因此,由于我将引用保存在切片中,正如 Charlie 所提到的,切片也是一个变量,我的代码是安全的,垃圾回收器不会意外释放内存。这就是我想确定的。谢谢!
0赞 icza 8/30/2023
@moo.duwayne 可寻址表达式充当变量,但这不是必需的。例如,将指针存储在地图中还可以防止它们被垃圾回收,但存储在地图中的值是不可寻址的。

答:

-3赞 Achref Nasri 8/29/2023 #1

在你的情况下,可能不是(引用将保持不变),但这也取决于你的程序对它做了什么:

Go 运行时在程序的生命周期内不会更改存储在切片中的引用(指针),但在一个条件下: -您不会在函数中重新分配切片或其元素指针([8]uint64 的数组)。只要不为切片的元素重新分配新值,引用将保持不变。

评论

0赞 moo.duwayne 8/30/2023
对不起,我的英语不好,所以这是我的理解:重新分配你的意思是执行或在程序结束时,对吧?因此,在第一种情况下,切片中的整个项目将通过 gc 获得自由,而在第二种情况下,只有 list[1] 将获得自由。右?list = make([]*ListItem, 0)list[1] = &ListChunk{}