我正在学习Rust,在那里,他们认为下面(python-等效)代码是不安全的:
vec = ['1', '2']
ref = vec[0]
vec.append('3')其基本原理是,ref是指向vec中元素的指针,但是,vec正在通过push命令在同一个作用域中发生变异,可能会将对象移动到内存中有足够空间的一个全新位置,从而导致ref是一个悬空指针=>,因此编译器由于代码不安全而失败。
我相信这种逻辑,但为什么在Python中这从来都不是问题呢?堆中仍然有vec,而ref是指针,对吗?
发布于 2022-06-25 05:58:51
ref不是指向vec的一部分的指针。它存储对字符串对象的引用。vec引用的list对象还存储对该字符串对象的引用。如果列表需要调整其底层存储的大小,它将把它持有的引用复制到一个新的缓冲区中,但是字符串不会移动,因此ref的引用不会因此操作而失效。
https://stackoverflow.com/questions/72751531
复制相似问题