Почему, когда я печатаю разыменованный указатель в main, который указывает на переменную, объявленную в функции, он не печатает ненужную память? - PullRequest
0 голосов
/ 13 февраля 2020
package main

import "fmt"

func point(x int) *int {
    y := x
    return &y//Shouldn't this be deallocated
}

func main() {
    x := 10
    pointer := point(x)
    fmt.Println(*pointer)
}

Не должна ли память для Y быть ненужной после вызова функции? Почему моя программа все еще выводит 10.

1 Ответ

3 голосов
/ 13 февраля 2020

Go Компилятор выполняет Escape-анализ для переменных и решает, размещать их в стеке или в куче. В вашем примере point возвращает адрес y, поэтому y экранирует point. Из-за этого y выделяется в куче, а не в стеке.

В отличие от C / C ++, вполне нормально возвращать переменные стека из функций. Многие функции, подобные конструкторам, записываются в виде:

func NewStruct() *Struct {
  return &Struct{}
}

Это распределяет структуру в куче и возвращает указатель на нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...