从函数中的局部变量返回指针

Dan*_*vic 0 pointers go

我正在读一本名为The Go Programming Language的书,在第2章中有关指针的内容如下

函数返回局部变量的地址是完全安全的.例如,在下面的代码中,即使在调用返回之后,由f的这个特定调用创建的局部变量v也将保持存在,并且指针p仍将引用它:

var p = f()
func f() *int {
    v := 1
    return &v
}
Run Code Online (Sandbox Code Playgroud)

我完全没有得到这个,一个局部变量应该在函数执行后被销毁.是因为可能在堆上分配了v.我知道在C中,如果你使用malloc分配空间,它将不会在函数执行后被销毁,因为它在堆上.

Adr*_*ian 6

Go不是C.尽管有相似之处,但它更高层次.它利用具有绿色线程调度程序和垃圾收集内存管理器的完整运行时.只要它有实时引用,它就永远不会收集内存.

Go编译器包含一个名为"转义分析"的阶段,它跟踪每个变量以查看它是否"转义"声明它的函数.可以转义的任何值都在堆上分配并由垃圾收集管理; 否则,它(通常)在堆栈上分配.

您可以找到有关该主题的更多信息: