使用move
重新分配值后,内存是否会生锈?
这个例子中的字符串"aaa"
发生了什么?
let mut s = String::from("aaa");
s = String::from("bbb");
我猜"aaa"
字符串被丢弃了——这是有道理的,因为它不再被使用了。然而,我在文档中找不到任何可以证实这一点的东西。(例如,本书只解释了当我们使用move
分配新值时会发生什么(。
我正试图理解Rust用来确保内存安全的规则,但我找不到在这种情况下会发生什么的明确规则。
是的,对变量的赋值将删除要替换的值。
不删除替换后的值将是一场灾难——因为Drop
经常用于解除分配和其他清理,如果不删除该值,最终会出现各种泄漏。
Move语义在这里是隐含的。s
中的数据通过从String::from("bbb")
产生的String
移动来初始化。存储在s
中的原始数据由于副作用而被丢弃(替换它的过程使它没有所有者,因此它作为操作的一部分被丢弃(。
根据析构函数文档(增加重点(:
当初始化的变量或临时变量超出范围时,它的析构函数将运行或删除赋值还会运行其左侧操作数的析构函数(如果已初始化(如果变量已部分初始化,则只删除其初始化字段。