문제:
포인터 조각을 조작할 때 주의를 권고하는 문서에도 불구하고 , 포인터 맵에 유사한 예방 조치가 필요한지 여부는 불분명합니다. 구체적으로 삭제하기 전에 항목을 nil로 설정해야 합니까, 아니면 전체 지도를 지워야 합니까? 가비지 수집기가 메모리 할당 해제를 적절하게 처리합니까?
조사:
Go 런타임 소스 코드(runtime/hashmap.go)를 조사한 결과 키와 값 저장소가 모두 지도 삭제 중에 지워지고 그 안에 포함된 모든 포인터를 0으로 만듭니다.
예를 통한 증명:
다음 코드는 메모리 누수가 없음을 보여줍니다.
<code class="go">type point struct { X, Y int } var m = map[int]*point{} func main() { fillMap() delete(m, 1) runtime.GC() time.Sleep(time.Second) fmt.Println(m) } func fillMap() { p := &point{1, 2} runtime.SetFinalizer(p, func(p *point) { fmt.Printf("Finalized: %p %+v\n", p, p) }) m[1] = p fmt.Printf("Put in map: %p %+v\n", p, p) }</code>
출력:
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]
이 예제에서는 구조체에 대한 포인터를 사용하고 종료자를 등록하여 포인터에 연결할 수 없는 시기를 감지한 다음 해당 맵 항목을 삭제합니다. 포인터에 대한 다른 참조가 없음에도 불구하고 해당 종료자는 가비지 수집 시 호출되어 맵에서 제거되었음을 나타냅니다.
결론:
소스 코드 검사 및 예시 테스트에서는 Go에서는 삭제하기 전에 항목이나 전체 지도를 지울 필요가 없습니다. 가비지 수집기는 맵에 포인터가 포함된 경우에도 메모리 할당 해제를 적절하게 처리합니다.
위 내용은 Go의 포인터 맵에 메모리 누수에 대한 특별한 처리가 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!