Eve*_*ton 4 arrays string memory-leaks go slice
golang字符串切片buf = buf[n:]会导致底层字节数组中的内存泄漏吗?
如果是这样,是否有可能获得有关底层字节数组的任何信息(如容量或基本内存地址),以验证泄漏?
请参阅以下示例代码:
var buf string
func push(s string) {
buf += s
if len(buf) > 3 {
buf = buf[len(buf)-3:] // can this line leak memory in underlying byte array?
}
fmt.Printf("buf=[%v]\n", buf)
}
Run Code Online (Sandbox Code Playgroud)
不,这个例子不会导致内存泄漏,因为每次调用时都需要分配新的字符串push.有时可能会保留一些字节以减少分配,但是如何工作是一个不应该考虑的实现细节.
如果您正在考虑在分配切片操作的结果时可能出现的类似情况,但从不附加.只要你理解切片的语义,每个说都没有泄漏.
s := make([]byte, 1024)
s = s[1000:]
fmt.Println(s, len(s), cap(s))
Run Code Online (Sandbox Code Playgroud)
此示例将保留分配的前1000个字节,但不可访问.答案很简单,不要这样做.这并不难避免,如果确实需要确保已经释放了底层数组,请使用copy将字节移动到新切片.
这与字符串相同:
s = s[1020:]
// may leave the first 1000 bytes allocated
Run Code Online (Sandbox Code Playgroud)
这也很容易看出发生了什么,并避免.如果你使用的是大字符串,那么你通常会更好地使用它[]byte,你可以更好地控制分配,并且可以在需要时复制字节.
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |