为了账号安全,请及时绑定邮箱和手机立即绑定

使用 descoped 变量的内存地址是否安全?

使用 descoped 变量的内存地址是否安全?

Go
aluckdog 2021-09-13 10:21:25
这段代码安全吗?b在if块结束时被取消范围,但a仍然指向b的内存地址。在这个简单的示例中,它似乎可以工作(它打印正确的值),但是在语言规范中,这将始终有效?使用 -m 编译以检查编译器优化,它说b不会逃逸到堆中。游乐场:http : //play.golang.org/p/ZzYkMg6FqBpackage mainimport "fmt"func main() {    a := new(int)    *a = 10    if *a > 0 {        b := 5        a = &b    }    fmt.Println(*a)}
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

Go 中没有悬空指针。

是否b超出范围无关紧要;a现在持有该地址并将被 GC 扫描。


查看完整回答
反对 回复 2021-09-13
?
噜噜哒

TA贡献1784条经验 获得超7个赞

是的,完全没问题。

作用域在 Go 中并不像在 C 或 Rust 中那么重要。Go 是一种垃圾收集语言。只要内存可以到达,它就不会被释放。在您的示例中, 的原始值a将在下一次 GC 期间被释放,因为它不再可用。

编辑:在堆栈上。在你的程序中,b没有逃逸,因为它不需要。如果您重写您的程序,以便b在堆栈上分配时将被删除(例如,像这样),您会看到它b确实逃脱了。Go 的逃逸分析很聪明,可以看到这样的事情。


查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信