gpt4 book ai didi

arrays - 这种类型的 golang 字符串 slice 会在底层字节数组中泄漏内存吗?

转载 作者:IT王子 更新时间:2023-10-29 00:37:43 26 4
gpt4 key购买 nike

buf = buf[n:] 这样的 golang 字符串 slice 会导致底层字节数组内存泄漏吗?

如果是这样,是否有可能获取有关底层字节数组的任何信息(如容量或基本内存地址),以验证泄漏?

请看下面的示例代码:

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 it on playground

最佳答案

不,这个例子不会导致内存泄漏,因为每次调用 push 时都需要分配新的字符串。有时可能会保留一些字节以减少分配,但其工作原理是一个不应考虑的实现细节。

如果您正在考虑分配 slice 操作的结果但从不追加时可能出现的类似情况。只要您了解 slice 的语义,就不会泄露任何信息。

s := make([]byte, 1024)
s = s[1000:]
fmt.Println(s, len(s), cap(s))

此示例将分配前 1000 个字节,但不可访问。答案很简单,不要那样做。这并不难避免,如果您确实需要确保已释放底层数组,请使用 copy 将字节移动到新的 slice 。

这对字符串同样适用:

s = s[1020:]
// may leave the first 1000 bytes allocated

这又是相当容易看到发生了什么,并避免。如果您使用大字符串,通常最好还是使用 []byte,这样您可以更好地控制分配,并可以在需要时复制字节。

关于arrays - 这种类型的 golang 字符串 slice 会在底层字节数组中泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com