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