1 回答

TA貢獻1805條經驗 獲得超10個贊
圍棋是垃圾收集。當不再有對資源的引用(包括當前保存在緩沖通道中的引用)時,將釋放資源。您不必擔心釋放后使用,并且返回/發(fā)送指向“局部”變量的指針也沒有錯。
只要局部塊完成,局部變量就不會失去其壽命嗎?
不,當垃圾回收器沒有發(fā)現(xiàn)對其價值的進一步引用時,它們會“失去生命”。超出其封閉作用域的變量會自動在堆上分配,并且在流從封閉作用域返回并且其堆棧內存丟失后可以安全使用。
可以這樣想:在 Go 中沒有“局部”變量這樣的東西,它比它的范圍長。這是不可能的。根據定義,超出聲明范圍的變量不是該意義上的“本地”變量,它會自動移動到堆中,并且只要任何內容繼續(xù)引用它,它就會存活。
值得擴展的內容:
for i := 0; i < 10; i++ { dogAddr := produce(i) // assume we already have: func produce(i int) *Dog c <- dogAddr // c: channel}當循環(huán)結束時,狗會立即被釋放嗎?
你的困惑似乎要么源于變量本身在某種程度上與它所指向的內存同義的想法,要么源于一個錯誤的想法,即指針超出范圍會以某種方式導致它所指向的記憶被回收,而其他東西仍然指向它,這在任何語言中都不是真的, 垃圾回收與否。dogAddr
dogAddr
指針只包含一個地址。該變量在循環(huán)的每次迭代中都會超出范圍,但它所保存的值(堆上對象的地址)已被值復制到通道中。是的,是一個“局部”變量,但這并不重要。它的值不是“本地的”,它的值是內部分配下來的某個非本地對象的內存地址。dogAddr
Dog
dogAddr
Dog
process()
我在一個簡單的代碼中對此進行了測試,結果似乎表明局部變量將永遠存在。
不,您剛剛表明,只要您引用了一點內存,該內存就不會被垃圾回收。
- 1 回答
- 0 關注
- 86 瀏覽
添加回答
舉報