Uczę się Go, a jako ćwiczenie chciałem zaimplementować połączoną listę. Dla porównania przyjrzałem się oficjalnemu kodowi Go (https://golang.org/src/container/list/list.go). Jedną rzeczą, która tkwi u mnie są te linie:Ustawianie wskaźników na zero, aby zapobiec wyciekom pamięci w Golang
108 // remove removes e from its list, decrements l.len, and returns e.
109 func (l *List) remove(e *Element) *Element {
110 e.prev.next = e.next
111 e.next.prev = e.prev
112 e.next = nil // avoid memory leaks
113 e.prev = nil // avoid memory leaks
114 e.list = nil
115 l.len--
116 return e
117 }
Jestem ciekaw, w jaki sposób ustalania wskaźników do zera w tym przypadku zapobiec wyciekom pamięci? Jeśli to możliwe, chciałbym skonstruować program, który ma tę wadę i zobaczyć go podczas profilowania z pprof (użyłbym zmodyfikowanej wersji list.go bez tego ustawienia wskaźnika zerowego).
W celu zwiększenia odpowiedzi: Jeśli jeden z węzłów ma wskaźnik poza nim, a następnie wszystkie sąsiednie usunięto węzły mają aktywną odniesienia w ten wskaźnik i nie zostaną usunięte.
- Tworzymy zewnętrzny wskaźnik wskazujący Node2
- Usuwamy węzły 2-4 z listy
- można się spodziewać w tym momencie tylko dla węzła 1,2 & 5 być żywy a reszta do GC-ed. Jednak ze względu na Node2 nadal wskazując na Node3 & itp., Cały łańcuch pozostaje nieodebrany.
Jestem zadowolony z tego, co opisujesz, popraw mnie, jeśli się mylę. Tak naprawdę wypróbowałem to z wersją zmodyfikowanej (z błędem pamięci błędów) i widzę, że nie zwalnia ona pamięci. – synepis