포인터 조각에서 요소를 삭제하면 잠재적인 메모리 누수가 발생할 수 있습니다. 이것이 지도에도 적용되는지 살펴보겠습니다.
Go 런타임 소스를 확인하면 mapdelete() 함수에서 삭제 시 키와 값 저장소가 모두 지워지는 것을 알 수 있습니다.
<br>558 func mapdelete(t <em>maptype, h </em>hmap, key unsafe.Pointer) {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> // ...
600 memclr(k, uintptr(t.keysize))
601 v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) dataOffset bucketCntuintptr(t.keysize) iuintptr(t.valuesize))
602 memclr(v, uintptr(t.valuesize) ))
// ...
618 }
이는 키 또는 값의 모든 포인터가 0으로 설정되어 참조가 중단됨을 의미합니다. 지도의 내부 데이터 구조에 적용됩니다.
이를 추가로 입증하기 위해 다음을 구성할 수 있습니다. 테스트:
<br>type point struct {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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)
}
이 테스트를 실행하면 등록된 종료자가 호출되어 포인터가 맵에서 제거되고 후속 가비지 수집이 확인되는 것을 확인합니다.
Go에서는 포인터 맵에서 항목을 삭제해도 메모리 누수가 발생하지 않습니다. 삭제 시 키와 값 저장소가 모두 지워지고 보유하고 있던 모든 포인터가 해제되어 적절한 가비지 수집이 보장됩니다.
위 내용은 포인터의 맵 항목을 삭제하면 Go에서 메모리 누수가 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!