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

这段代码安全吗?b在if块结束时被取消范围,但a仍然指向b的内存地址。在这个简单的示例中,它似乎可以工作(它打印正确的值),但是在语言规范中,这将始终有效?


使用 -m 编译以检查编译器优化,它说b不会逃逸到堆中。


游乐场:http : //play.golang.org/p/ZzYkMg6FqB


package main


import "fmt"


func main() {

    a := new(int)

    *a = 10

    if *a > 0 {

        b := 5

        a = &b

    }

    fmt.Println(*a)

}


aluckdog
浏览 180回答 3
3回答

浮云间

Go 中没有悬空指针。是否b超出范围无关紧要;a现在持有该地址并将被 GC 扫描。

噜噜哒

是的,完全没问题。作用域在 Go 中并不像在 C 或 Rust 中那么重要。Go 是一种垃圾收集语言。只要内存可以到达,它就不会被释放。在您的示例中, 的原始值a将在下一次 GC 期间被释放,因为它不再可用。编辑:在堆栈上。在你的程序中,b没有逃逸,因为它不需要。如果您重写您的程序,以便b在堆栈上分配时将被删除(例如,像这样),您会看到它b确实逃脱了。Go 的逃逸分析很聪明,可以看到这样的事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go