加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数组 – 这种类型的golang字符串切片可以在底层字节数组中泄漏内

发布时间:2020-12-16 09:27:25 所属栏目:大数据 来源:网络整理
导读:像buf = buf [n:]这样的golang字符串切片会导致底层字节数组中的内存泄漏吗? 如果是这样,是否有可能获得有关底层字节数组的任何信息(如容量或基本内存地址),以验证泄漏? 请参阅以下示例代码: var buf stringfunc push(s string) { buf += s if len(buf)
像buf = buf [n:]这样的golang字符串切片会导致底层字节数组中的内存泄漏吗?

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

请参阅以下示例代码:

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时都需要分配新的字符串.有时可能会保留一些字节以减少分配,但是如何工作是一个不应该考虑的实现细节.

如果您正在考虑在分配切片操作的结果时可能出现的类似情况,但从不附加.只要你理解切片的语义,每个说都没有泄漏.

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

此示例将保留分配的前1000个字节,但不可访问.答案很简单,不要这样做.这并不难避免,如果确实需要确保已经发布了底层数组,请使用copy将字节移动到新的切片.

这与字符串相同:

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

这也很容易看出发生了什么,并避免.如果你使用的是大字符串,那么你最好还是使用[]字节,你可以更好地控制分配,并且可以在需要时复制字节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读