我正在读一本叫做《 Go编程语言》的书,在有关指针的第二章中,写了以下内容
函数返回局部变量的地址是绝对安全的。例如,在下面的代码中,即使调用返回后,由对f的特定调用创建的局部变量v仍将存在,并且指针p仍将引用它:
var p = f() func f() *int { v := 1 return &v }
我完全不明白这一点,应该在执行函数后销毁局部变量。是因为可能v是在堆上分配的。我知道在C语言中,如果您使用malloc分配空间,函数执行后就不会销毁它,因为它在堆上。
Go不是C。尽管有相似之处,但它的层次更高。它利用了带有绿色线程调度程序和垃圾收集内存管理器的完整运行时。只要有实时引用,它就永远不会收集内存。
Go编译器包括一个称为“转义分析”的阶段,在此阶段,它跟踪每个变量以查看其是否“转义”了声明其的函数。任何可以转义的值都在堆上分配,并由垃圾回收管理。否则,它通常分配在堆栈上。
您可以找到有关该主题的更多信息: