Tôi đang học Go, và như một bài tập tôi muốn thực hiện một danh sách liên kết. Để tham khảo, tôi đã xem mã Go chính thức (https://golang.org/src/container/list/list.go). Một điều khiến tôi mắc kẹt là những dòng này:Thiết lập con trỏ tới nil để tránh rò rỉ bộ nhớ trong 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 }
Tôi tò mò về cách thiết lập con trỏ thành 0 trong trường hợp này ngăn ngừa rò rỉ bộ nhớ? Nếu có thể tôi muốn xây dựng một chương trình có lỗ hổng này và nhìn thấy nó trong khi profiling với pprof (tôi sẽ sử dụng một verion sửa đổi của list.go mà không có thiết lập con trỏ nil này).
Để làm rõ câu trả lời: Nếu một trong các nút có một con trỏ bên ngoài để nó, sau đó tất cả các nút lấy liền kề sẽ có một tham chiếu hoạt động thông qua con trỏ đó và sẽ không được gỡ bỏ.
- Chúng tôi tạo ra một con trỏ trỏ bên ngoài để node2
- Chúng tôi loại bỏ các nút 2-4 từ danh sách
- Bạn mong chờ vào thời điểm này chỉ dành cho các Node 1,2 & 5 được sống và phần còn lại là GC-ed. Tuy nhiên, do Node2 vẫn còn trỏ đến Node3 & vv, toàn bộ chuỗi vẫn không bị thu thập.
Tôi đã bỏ qua câu hỏi với hình ảnh về những gì bạn mô tả, hãy sửa tôi nếu tôi sai. Tôi thực sự đã thử điều này với một phiên bản sửa đổi (với lỗi rò rỉ bộ nhớ) của danh sách và tôi có thể thấy nó không giải phóng bộ nhớ. – synepis