小编典典

返回堆栈上的指针

go

在C语言中,当我从函数返回堆栈创建的变量的指针时,在函数返回后内存将被丢弃,从而使指针无法取消引用。但是在Go中,编译器没有给我任何错误。这是否意味着这样做是安全的?

package main

import (
    "fmt"
)

func main() {
    fmt.Println(*(something()))
}

func something() *string {
    s := "a"
    return &s
}

阅读 314

收藏
2020-07-02

共1个答案

小编典典

是的,这是安全的,并且是Go编程中的常规模式。Go使用转义分析来移动带有指针的所有值,这些指针会自动将栈转义到堆。您无需担心在何处分配值。

从Go常见问题解答中:“我如何知道是在堆还是在堆栈上分配了变量?”

如果编译器无法证明函数返回后未引用该变量,则编译器必须在垃圾回收堆上分配该变量,以避免悬空指针错误

使用该-gcflags -m选项,您可以在编译期间看到这些优化选择。

2020-07-02