"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 포인터를 잡을 때 맵 항목을 삭제하면 메모리 누출이 발생합니까?

포인터를 잡을 때 맵 항목을 삭제하면 메모리 누출이 발생합니까?

2025-02-06에 게시되었습니다
검색:799

Does Deleting a Map Entry Lead to Memory Leaks When Holding Pointers?

맵 항목을 삭제하면 메모리 누출이 발생합니까?


최근 논의에서 요소를 삭제하는 것이 제기되었습니다. 포인터 조각은 잠재적으로 메모리 누출로 이어질 수 있습니다. 이 질문은 해당 문의를 맵으로 확장합니다. 특히 맵 보유 포인터에서 항목을 삭제하면 비슷한 동작이 발생하는지 여부입니다.

구현 확인 :

이 주장의 진실성을 결정합니다. GO의 런타임에서 맵 삭제에 대한 소스 코드를 조사해 봅시다 : 런타임/hashmap.go (함수 mapdelete ()). 시험에 따르면 키와 값은 모두 삭제시 ( #600, #602).


제로화 시사점 :

이 값을 효과적으로 지우는 것은 맵과 뾰족한 물체. 이렇게하면 값 자체가 포인터 일 수 있지만 맵은 더 이상 참조하지 않도록합니다. 결과적으로, 뾰족한 물체는 다른 참조가없는 경우 쓰레기 수집을받을 자격이됩니다.

실제 예 :
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)
}

타입 포인트 구조 { x, y int } var m = map [int]*point {} func main () { fillMap () 삭제 (m, 1) runtime.gc () Time.sleep (Time.second) fmt.println (m) } func fillmap () { P : = & amp; 포인트 {1, 2} runtime.setfinalizer (p, func (p *point) { fmt.printf ( "최종 : % p % v \ n", p, p) }) m [1] = p fmt.printf ( "맵에 넣음 : % p % v \ n", p, p) }

Put in map: 0x1040a128 &{X:1 Y:2}
Finalized: 0x1040a128 &{X:1 Y:2}
map[]

맵에 넣습니다 : 0x1040a128 & {x : 1 y : 2} 마무리 : 0x1040A128 & {x : 1 y : 2} Map []

이 예에서는 포인터 값 (P)이 맵에 넣고 최종화기가 쓰레기 수집시 호출되도록 설정됩니다. 지도에서 항목을 삭제하고 쓰레기 수집을 강제 한 후 파이널 라이저가 호출되어 포인터가 실제로지도에서 제거되었음을 증명합니다.
결론 :

소스 코드를 기반으로합니다. 분석 및 실용적인 예에서, 우리는 포인터 맵에서 항목을 삭제하면

Does Deleting a Map Entry Lead to Memory Leaks When Holding Pointers?가 메모리 누출을 유발하지 않는다는 결론을 내릴 수 있습니다. GO 런타임은 청소 된 값을 제로화하여 적절한 쓰레기 수집을 보장하여 다른 참조가 존재하지 않을 때 뾰족한 객체를 되 찾을 수 있습니다.

릴리스 선언문 이 기사는 다음과 같이 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3