我正在學習Rust,他們認為以下(python-equivalent)代碼不安全:
vec = ['1', '2']
ref = vec[0]
vec.append('3')
基本原理是ref
是指向vec
中元素的指針,然而,vec
是通過push命令在同一范圍內變異的,這可能涉及將對象移動到內存中有足夠空間的全新位置,導致ref
是一個懸空指針=>因此,編譯器會因為不安全的代碼而失敗。
我相信這個邏輯,但為什么這在Python中從來都不是問題呢?堆中仍然有vec
,而ref
是指針,對嗎?
ref
不是指向vec
部分的指針。它存儲對字符串對象的引用。vec
引用的列表對象還存儲對該字符串對象的引用。如果列表需要調整其底層存儲的大小,它會將其持有的引用復制到新的緩沖區中,但字符串不會移動,因此ref
的引用不能通過此操作無效。