>  기사  >  백엔드 개발  >  포인터의 맵 항목을 삭제하면 Go에서 메모리 누수가 발생합니까?

포인터의 맵 항목을 삭제하면 Go에서 메모리 누수가 발생합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-24 03:54:30463검색

Does Deleting a Map Entry of Pointers Cause Memory Leaks in Go?

Go에서 포인터 맵의 항목을 삭제하면 메모리 누수가 발생합니까?

포인터 조각에서 요소를 삭제하면 잠재적인 메모리 누수가 발생할 수 있습니다. 이것이 지도에도 적용되는지 살펴보겠습니다.


소스 검사

Go 런타임 소스를 확인하면 mapdelete() 함수에서 삭제 시 키와 값 저장소가 모두 지워지는 것을 알 수 있습니다.

<br>558 func mapdelete(t <em>maptype, h </em>hmap, key unsafe.Pointer) {</p>
<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>
<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 := &amp;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.