Я учусь Go, и в качестве упражнения я хотел реализовать связанный список. Для справки я посмотрел официальный код Go (https://golang.org/src/container/list/list.go). Одна вещь, которая застряла со мной эти строки:Настройка указателей на нуль для предотвращения утечки памяти в 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 }
Я любопытно, как же установка указателей на ноль в этом случае предотвратить утечку памяти? Если возможно, я хотел бы построить программу, которая имеет этот недостаток и увидеть ее во время профилирования с помощью pprof (я бы использовал модифицированный вариант list.go без этой установки указателя nil).
Для ясности ответа: Если один из узлов имеет внешний указатель на него, а затем все соседние узлы удалены будут иметь активную ссылку через этот указатель и не будут удалены.
- Мы создаем внешний указатель, указывающий на Node2
- Снимают узлы 2-4 из списка
- Вы ожидали бы в этот момент только для узла 1,2 & 5, чтобы быть живыми а остальные - GC-ed. Однако из-за Node2 все еще , указывая на Node3 & и т. Д., Вся цепочка остается неповрежденной.
Я задал вопрос с изображением того, что вы описываете, пожалуйста, исправьте меня, если я ошибаюсь. Я действительно пробовал это с измененной (с ошибкой памяти) версией списка, и я вижу, что это не освобождает память. – synepis