Go에서 데이터 구조를 조작할 때 일반적으로 우려되는 점은 메모리 누수 가능성입니다. 이 질문은 포인터 맵에서 항목을 삭제하면 이러한 누출이 발생할 수 있는지 여부에 중점을 둡니다.
문서에서는 이 문제를 명시적으로 다루지 않지만 Go 런타임 소스를 검사합니다. 코드는 맵에서 항목이 삭제되면 키와 값 저장소가 모두 지워지는(제로화) 것을 보여줍니다. 이는 안에 포함된 모든 포인터도 지워진다는 것을 의미합니다.
// Clear key storage. memclr(k, uintptr(t.keysize)) // Clear value storage. v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) + dataOffset + bucketCnt*uintptr(t.keysize) + i*uintptr(t.valuesize)) memclr(v, uintptr(t.valuesize))
이를 확증하기 위해 포인터 맵이 있는 샘플 프로그램을 만들고 종료자를 등록할 수 있습니다. 포인터에 도달할 수 없을 때 잡기:
import ( "fmt" "runtime" "sync" "time" ) type point struct { X, Y int } func main() { // Create a map and put a pointer value in it, with a finalizer. m := map[int]*point{} 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) // Delete the entry from the map. delete(m, 1) // Force garbage collection. runtime.GC() // Sleep to ensure the finalizer has a chance to run. time.Sleep(time.Second) // Print the map to verify the map itself wasn't garbage collected. fmt.Println(m) }
이를 실행하면 다음과 같은 출력이 생성됩니다.
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]
보시다시피 포인터가 지도에서 제거되면 종료자가 호출됩니다. 도달할 수 없게 되어 메모리 누수가 없음을 보여줍니다.
위 내용은 Go에서 지도 항목을 삭제하면 메모리 누수가 발생할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!