container/list.Remove() 的源代碼試圖通過將 nil 分配給特定變量來顯式避免內存泄漏,我們為什么要這樣做?謝謝!代碼在1.12版本的golang源碼中。// remove removes e from its list, decrements l.len, and returns e.func (l *List) remove(e *Element) *Element { e.prev.next = e.next e.next.prev = e.prev e.next = nil // avoid memory leaks e.prev = nil // avoid memory leaks e.list = nil l.len-- return e}GC不能處理這種情況嗎?
1 回答

元芳怎么了
TA貢獻1798條經驗 獲得超7個贊
從列表中刪除的元素在刪除后不能指向列表中的其他元素。
考慮清單A -> B -> C -> D。B然后從上面的列表中刪除該元素。沒有聲明
e.next = nil
在上面截取的代碼中,內存布局將如下所示。
A -> C > D
^
|
B
現在,如果元素 B 仍在使用中(比如元素 B 一直使用到程序結束),它有一個指向 C 的指針。這意味著即使 C 稍后從列表中刪除并且不需要,也無法對 C 進行垃圾回收不再。
類似的情況可能發生在e.prev
- 1 回答
- 0 關注
- 128 瀏覽
添加回答
舉報
0/150
提交
取消