возвращение указателя из локальной переменной в функции - PullRequest
0 голосов
/ 25 октября 2018

Я читаю книгу под названием «Язык программирования Go», и во 2-й главе об указателях написано следующее:

Функция совершенно безопасно возвращает адрес локальной переменной.,Например, в приведенном ниже коде локальная переменная v, созданная этим конкретным вызовом f, будет существовать даже после возврата вызова, и указатель p будет по-прежнему ссылаться на него:

var p = f()
func f() *int {
    v := 1
    return &v
}

Полностью не понимаю, предполагается, что локальная переменная будет уничтожена после выполнения функции.Это потому, что, возможно, v выделяется в куче.Я знаю, что в C, если вы выделите пространство с помощью malloc, оно не будет уничтожено после выполнения функции, потому что оно находится в куче.

1 Ответ

0 голосов
/ 25 октября 2018

Go не C. Несмотря на сходства, это намного более высокий уровень.Он использует полную среду выполнения с планировщиком зеленых потоков и диспетчером памяти для сбора мусора.Он никогда не будет собирать память до тех пор, пока у него есть живые ссылки.

Компилятор Go включает в себя этап, называемый escape-анализом, где он отслеживает каждую переменную, чтобы узнать, «экранирует» ли она функцию, в которой она объявлена.,Любое значение, которое может быть экранировано, размещается в куче и управляется сборщиком мусора;в противном случае он (обычно) размещается в стеке.

Более подробную информацию можно найти по теме:

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