知识卡片
截取保留引用
内容
从大切片截取小片段会继续引用同一底层数组,可能让本该释放的大数组长期存活。必要时 copy 出独立切片;发散:内存泄漏有时不是忘记释放,而是无意保留引用。
参考来源
- 位置:《Go语言底层原理剖析》第7章《切片使用方法与底层原理》7.1.3、7.2.5节《切片的截取》《切片的完整复制》
- 结论依据:原文说明"被截取后的数组仍然指向原始切片的底层数据",并用 bar 截取 foo 中间元素、修改 bar 会影响 foo 的例子说明共享底层数组;随后在7.2.5节指出"复制的切片不会改变指向底层的数据源,但有些时候我们希望建一个新的数组,并且与旧数组不共享相同的数据源,这时可以使用copy函数",两处合并可推出"截取切片默认保留对整个底层数组的引用,需要 copy 才能真正脱离"的结论。
- 原始内容:切片在被截取时的另一个特点是,被截取后的数组仍然指向原始切片的底层数据……复制的切片不会改变指向底层的数据源,但有些时候我们希望建一个新的数组,并且与旧数组不共享相同的数据源,这时可以使用copy函数。