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

Pointers 从函数中的局部变量返回指针,pointers,go,Pointers,Go,我正在读一本名为Go编程语言的书,在第二章关于指针的内容中,我写了以下内容 函数返回局部变量的地址是完全安全的。例如,在 在下面的代码中,由这个对f的特殊调用创建的局部变量v将仍然存在 调用返回后,指针p仍将引用它: 我完全不明白,一个局部变量应该在函数执行后被销毁。这是因为可能在堆上分配了v。我知道在C中,如果使用malloc分配空间,函数执行后它不会被销毁,因为它在堆上。Go不是C。尽管有相似之处,但它的级别要高得多。它利用了一个完整的运行时,带有一个绿色的线程调度程序和垃圾收集内存管理器。

我正在读一本名为Go编程语言的书,在第二章关于指针的内容中,我写了以下内容

函数返回局部变量的地址是完全安全的。例如,在 在下面的代码中,由这个对f的特殊调用创建的局部变量v将仍然存在 调用返回后,指针p仍将引用它:


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

Go不是C。尽管有相似之处,但它的级别要高得多。它利用了一个完整的运行时,带有一个绿色的线程调度程序和垃圾收集内存管理器。只要有活动引用,它就永远不会收集内存

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

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


Go不是C。Go有一个垃圾收集器为您管理内存。“局部”变量在Go中的工作方式与在C中的工作方式不同。变量是在堆栈上分配还是在堆上分配由编译器在编译时根据转义分析来确定,而不仅仅是基于它是否是指针(就像在C中一样)。一般来说,您可以简单地信任Go的垃圾收集器。它将为您管理内存,该语言通常防止您访问过时指针或未分配内存的情况(Go中的segfaults通常来自尝试访问nil指针)。访问
nil
指针不应出现segfault,但它会触发死机。
SIGSEGV实际上被视为分段故障,或者是由无效内存引用引起的故障,无论您如何调用它。Local指的是变量的范围,而不是值的分配方式。规范中没有关于所有变量分配的详细信息。请问您有什么资料可以让我了解更多信息吗?只是添加了一些参考资料。
var p = f()
func f() *int {
    v := 1
    return &v
}