Ale*_*eft 1 python memory memory-management heap-memory rust
我正在学习 Rust,他们认为以下(相当于 python 的)代码是不安全的:
vec = ['1', '2']
ref = vec[0]
vec.append('3')
Run Code Online (Sandbox Code Playgroud)
基本原理是ref指向 中元素的指针vec,但是,vec正在通过 Push 命令在同一范围内发生变化,这可能涉及将对象移动到内存中有足够空间的全新位置,导致成为ref悬空指针 =>因此,编译器会因代码不安全而失败。
我对这个逻辑深信不疑,但到底为什么这在 Python 中从来都不是问题呢?我们vec在堆中仍然有 和ref是一个指针,对吗?
ref不是指向 的一部分的指针vec。它存储对字符串对象的引用。by 引用的列表对象vec还存储对该字符串对象的引用。如果列表需要调整其底层存储的大小,它会将其保存的引用复制到新的缓冲区中,但字符串不会移动,因此ref此操作不会使 的引用无效。