在C语言中,当我从函数返回堆栈创建的变量的指针时,在函数返回后内存将被丢弃,从而使指针无法取消引用。但是在Go中,编译器没有给我任何错误。这是否意味着这样做是安全的?
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
是的,这是安全的,并且是Go编程中的常规模式。Go使用转义分析来移动带有指针的所有值,这些指针会自动将栈转义到堆。您无需担心在何处分配值。
从Go常见问题解答中:“我如何知道是在堆还是在堆栈上分配了变量?”
如果编译器无法证明函数返回后未引用该变量,则编译器必须在垃圾回收堆上分配该变量,以避免悬空指针错误
使用该-gcflags -m选项,您可以在编译期间看到这些优化选择。
-gcflags -m