【问题标题】:Returning a pointer on stack返回堆栈上的指针
【发布时间】:2016-11-09 02:58:12
【问题描述】:

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

package main

import (
    "fmt"
)

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

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

【问题讨论】:

    标签: function go stack


    【解决方案1】:

    是的,这在 Go 编程中是安全且正常的模式。 Go 使用 escape analysis 将任何带有指针的值自动移出堆栈到堆中。您无需关心分配值的位置。

    来自 Go 常见问题解答:"How do I know whether a variable is allocated on the heap or the stack?"

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

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

    【讨论】:

      【解决方案2】:

      是的,在 Golang 中可以返回一个指向局部变量的指针。 Golang 将为您管理对象的生命周期,并在所有指向它的指针消失时释放它。

      在另一个答案中,我指出了 C/C++ 指针和 Golang 指针之间的所有区别:What is the meaning of '*' and '&' in Golang?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-18
        • 2011-08-24
        • 2015-11-16
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        相关资源
        最近更新 更多