2016-07-06 87 views
9

In C quando restituisco un puntatore di una variabile creata da una funzione da una pila, la memoria scarta dopo che la funzione viene restituita, rendendo quindi il puntatore impossibile alla dereferenziazione. Ma in Go, il compilatore non mi sta dando alcun errore. Significa che questo è sicuro da fare?Go - Restituisce un puntatore nello stack

package main 

import (
    "fmt" 
) 

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

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

risposta

10

Sì, questo è un modello normale e sicuro nella programmazione Go. Go usa escape analysis per spostare qualsiasi valore con puntatori che sfuggono automaticamente allo stack. Non è necessario preoccuparsi di dove vengono assegnati i valori.

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

se il compilatore non è in grado di dimostrare che la variabile non viene fatto riferimento, dopo la funzione ritorna, quindi il compilatore deve allocare la variabile sul mucchio garbage collection per evitare penzoloni errori puntatore

È possibile visualizzare queste opzioni di ottimizzazione durante la compilazione utilizzando l'opzione -gcflags -m.

3

Sì, in Golang è possibile restituire un puntatore a una variabile locale. Golang gestirà la vita degli oggetti per te e la libererà quando tutti i puntatori a esso sono andati.

In un'altra risposta indico tutte le differenze tra i puntatori C/C++ ei puntatori Golang: What is the meaning of '*' and '&' in Golang?