Go에서 맵 항목 삭제 및 메모리 누수
SliceTricks의 첫 번째 메모는 실제로 포인터 조각을 관리할 때 메모리 누수에 대한 주의를 촉구합니다. 이 글에서는 동일한 우려 사항이 지도에도 적용되는지 살펴보고 코드 예제를 통해 포괄적인 설명을 제공합니다.
항목을 삭제할 때 지도에서 메모리 누수가 발생합니까?
일반적인 믿음과는 달리, 맵에서 항목을 삭제해도 메모리 누수가 발생하지 않습니다. Runtime/hashmap.go에 있는 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>
맵에 구조체에 대한 포인터를 삽입하고 맵 항목을 삭제한 후 강제로 가비지 수집을 수행합니다. 출력에는 등록된 종료 함수가 호출되어 포인터가 성공적으로 제거되었으며 가비지 수집에 적합함을 나타내므로 메모리 누수가 없음을 증명합니다.
지우기 대 삭제: 미묘함 구별
항목을 삭제하면 특정 항목이 제거되지만 전체 맵을 지우면 모든 키-값 쌍이 제거되고 맵의 내부 데이터 구조가 재설정됩니다. 결과적으로 맵을 지우면 맵에 포함된 모든 참조도 해제되어 해당 항목에 포함된 모든 포인터와 함께 가비지 수집 대상이 됩니다.
결론적으로 Go의 맵에서 항목을 삭제해도 메모리가 발생하지 않습니다. 누출. 기본 구현은 키와 값 모두에 대한 저장소를 효과적으로 지우고 외부 개체에 대한 포인터를 분리합니다. 이를 통해 적절한 메모리 관리가 보장되고 잠재적인 누출을 방지할 수 있습니다.
위 내용은 Go에서 지도 항목을 삭제할 때 메모리 누수가 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!