Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning a pointer on stack

Tags:

stack

function

go

In C when I return a pointer of a stack-created variable from a function, the memory discards after the function is returned, thus making the pointer impossible to dereference. But in Go, the compiler is not giving me any errors. Does that mean that this is safe to do?

package main

import (
    "fmt"
)

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

func something() *string {
    s := "a"
    return &s
} 
like image 826
Ben Avatar asked Jul 06 '16 21:07

Ben


1 Answers

Yes, this is safe and a normal pattern in Go programming. Go uses escape analysis to move any values with pointers that escape the stack to the heap automatically. You don't need to be concerned with where values are allocated.

From the Go FAQ: "How do I know whether a variable is allocated on the heap or the stack?"

if the compiler cannot prove that the variable is not referenced after the function returns, then the compiler must allocate the variable on the garbage-collected heap to avoid dangling pointer errors

You can see these optimization choices during compilation by using the -gcflags -m option.

like image 51
JimB Avatar answered Oct 31 '22 12:10

JimB