亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這種類型的 golang 字符串切片會在底層字節數組中泄漏內存嗎?

這種類型的 golang 字符串切片會在底層字節數組中泄漏內存嗎?

Go
精慕HU 2021-12-06 14:56:11
golang 字符串切片是否buf = buf[n:]會導致底層字節數組中的內存泄漏?如果是這樣,是否可以獲取有關底層字節數組的任何信息(如容量或基本內存地址)以驗證泄漏?請參閱下面的示例代碼:var buf stringfunc 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)}
查看完整描述

2 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

不,這個例子不會導致內存泄漏,因為每次調用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

這再次很容易看到發生了什么,并避免。如果您使用大字符串,通常最好使用[]byte任何方式,這樣您可以更好地控制分配,并且可以在需要時復制字節。


查看完整回答
反對 回復 2021-12-06
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

將切片表達式應用于字符串中的結果p := s[i:j]是一個字符串。據我所知,Go 語言規范(https://golang.org/ref/spec)沒有指定p將由與s.

然而,在 Go 1.6 和更早版本中,一個實時引用ps不會被垃圾收集。然而,這可能會在 Go 的未來版本中改變。

一個有趣的事實是,Java 中的String.substring方法在 Java 8 之前以相同的方式實現。然而,在 Java 8 中substring返回一個副本。

回到你的例子。每次調用push函數時,以下行實際上都會創建一個新的字符串實例:

buf += s

buf 的舊實例被垃圾收集。所以你的例子不受上述問題的影響。


查看完整回答
反對 回復 2021-12-06
  • 2 回答
  • 0 關注
  • 368 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號