2016-07-06 4 views
9

C에서 함수에서 스택 생성 변수의 포인터를 반환하면 함수가 반환 된 후 메모리가 삭제되어 포인터를 참조 해제 할 수 없게됩니다. 그러나 Go에서는 컴파일러가 오류를주지 않습니다. 이것이 안전하다는 것을 의미합니까?이동 - 포인터를 스택에 반환

package main 

import (
    "fmt" 
) 

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

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

답변

10

예, 이것은 Go 프로그래밍의 일반적인 패턴과 안전합니다. Go는 escape analysis을 사용하여 스택에서 자동으로 힙을 이스케이프하는 포인터로 모든 값을 이동합니다. 값이 할당되는 위치에 관심을 가질 필요는 없습니다. 컴파일러는 변수가 함수가 반환 한 후 참조되지 않는다는 것을 증명할 수없는 경우 "How do I know whether a variable is allocated on the heap or the stack?"

는 다음 컴파일러는 포인터 오류 매달려 피하기 위해 가비지 수집 힙에 변수를 할당해야합니다 이동 자주 묻는 질문에서

-gcflags -m 옵션을 사용하여 컴파일 중에 이러한 최적화 옵션을 볼 수 있습니다.

3

예, Golang에서는 로컬 변수에 대한 포인터를 반환하는 것이 좋습니다. Golang은 개체 수명을 관리하고 개체 수명이 다할 때 해방시킵니다.

또 다른 대답은 C/C++ 포인터와 Golang 포인터 간의 모든 차이점을 지적합니다. What is the meaning of '*' and '&' in Golang?