MST

星途 面试题库

面试题:Go语言中,导致内存逃逸到堆上的常见函数调用场景有哪些

在Go语言中,请举例说明至少两种会引发内存逃逸到堆上的函数调用场景,并简要解释其原因。
15.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 返回局部变量指针
package main

func createString() *string {
    s := "hello"
    return &s
}

原因:在函数createString中,局部变量s原本应在栈上分配内存。但由于返回了其指针,函数调用结束后,若s在栈上,其内存将被释放,指针会成为野指针。为避免这种情况,Go语言编译器会将s分配到堆上,这样即使函数返回,内存依然有效。

  1. 传递大的结构体
package main

type BigStruct struct {
    data [10000]int
}

func processStruct(b BigStruct) {
    // 处理逻辑
}
func main() {
    var big BigStruct
    processStruct(big)
}

原因:如果BigStruct结构体非常大,将其作为参数传递到函数processStruct时,在栈上分配这么大的空间可能会导致栈溢出风险。为了避免这种情况,Go语言编译器会选择将big分配到堆上,以保证程序运行的稳定性。