구현 확인 :
제로화 시사점 :
이 값을 효과적으로 지우는 것은 맵과 뾰족한 물체. 이렇게하면 값 자체가 포인터 일 수 있지만 맵은 더 이상 참조하지 않도록합니다. 결과적으로, 뾰족한 물체는 다른 참조가없는 경우 쓰레기 수집을받을 자격이됩니다.
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)이 맵에 넣고 최종화기가 쓰레기 수집시 호출되도록 설정됩니다. 지도에서 항목을 삭제하고 쓰레기 수집을 강제 한 후 파이널 라이저가 호출되어 포인터가 실제로지도에서 제거되었음을 증명합니다.
결론 :
가 메모리 누출을 유발하지 않는다는 결론을 내릴 수 있습니다. GO 런타임은 청소 된 값을 제로화하여 적절한 쓰레기 수집을 보장하여 다른 참조가 존재하지 않을 때 뾰족한 객체를 되 찾을 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3