|
|
|
@ -109,7 +109,7 @@ println!("{}", s); // This will print `hello, world!`
|
|
|
|
|
|
|
|
|
|
第一部分由我们完成:当调用`String::from`时,它的实现请求它需要的内存。这在编程语言中是非常通用的。
|
|
|
|
|
|
|
|
|
|
然而,第二部分实现起来就各有区别了。在有**垃圾回收(GC)**的语言中, GC 记录并清除不再使用的内存,而我们作为程序员,并不需要关心他们。没有 GC 的话,识别出不再使用的内存并调用代码显式释放就是我们程序员的责任了,正如请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要`allocate`和`free`一一对应。
|
|
|
|
|
然而,第二部分实现起来就各有区别了。在有**垃圾回收**(*GC*)的语言中, GC 记录并清除不再使用的内存,而我们作为程序员,并不需要关心他们。没有 GC 的话,识别出不再使用的内存并调用代码显式释放就是我们程序员的责任了,正如请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要`allocate`和`free`一一对应。
|
|
|
|
|
|
|
|
|
|
Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是列表 4-1 中作用域例子的一个使用`String`而不是字符串字面值的版本:
|
|
|
|
|
|
|
|
|
|