The Rust Programming Language, first edition说Rust没有垃圾收集器:
它在没有垃圾收集器的情况下维护这些目标
然而,在discussing choosing your guarantees中,它也说:
Rc<T>
是引用计数指针。换句话说,这让我们有多个“拥有”指向同一数据的指针,当所有指针都超出范围时,数据将被删除(析构函数将被运行)。
据我了解,这正是指针如垃圾收集语言(如Python)的工作方式。
我认为垃圾收集是任何阻止手动释放动态分配内存的过程。我想我不明白Rust指南认为垃圾收集是什么。
答案 0 :(得分:11)
我认为垃圾收集是任何阻止手动释放动态分配内存的过程
然后Rust确实有&#34;垃圾收集&#34;!
fn make_stuff() {
// Allocate memory on the heap and store `true` in it
let thing = Box::new(true);
// Allocate memory on the heap and store 1000 numbers in it.
let things = vec![42; 1000];
} // Look Ma! No manual deallocation!
当thing
和things
超出范围时(在这种情况下,在方法结束时),他们已分配的内存将为您释放。
Rc
和Arc
允许比此更灵活;你应该给their docs一个阅读以了解更多信息。
除了@ Manishearth的答案之外,还有这个细节(强调我的):
在最后一位所有者的生命周期结束时自动释放
在许多垃圾收集语言中,垃圾收集与其他代码一起发生在带外。在Rust中,释放的位置将是已知的。
鉴于此Java:
public static ArrayList alpha()
{
return new ArrayList();
}
public static void beta()
{
alpha(); // Unused result
}
当从内存中删除ArrayList时,我不相信你可以肯定地说 。在等效的Rust代码中,您知道Arc
或Rc
一旦超出范围就会被销毁。
答案 1 :(得分:7)
This文章有点陈旧,但它强调了Rust没有GC的含义。只有RAII和所有权是Rust固有的。它们有助于编写类似参考计数的GC,例如Rc和Arc,但这些不是语言的一部分,它们是标准库的一部分。它产生了巨大的变化。
如果您考虑在Rust中编写操作系统,则不能在代码的一部分中使用任何形式的GC或使用标准库。在这个层面上,重要的是要知道什么是语言的一部分,什么不是。举一个简单的例子,看看here。
相反,在Java或Python等语言中,您无法阻止您的代码使用GC,因为它通过语言设计隐式使用它。
在Rust中,就像在C/C++中一样,GC是库的一部分,它的使用是明确的。
答案 2 :(得分:4)
Rc
没有循环收集。如果创建引用循环,则可能会在尝试增加引用计数时使程序崩溃。
虽然这在技术上也算作垃圾收集器,但它并不是普遍有用的,因为你对它可以包含的类型有限制。
答案 3 :(得分:0)
如果你坚持正确,垃圾收集器会收集。它收集要释放的内存位置列表。另一方面Rc / Arc没有,所以我认为你不能称之为垃圾收集。
然而,rust有std::gc
模块,所以生锈实际上是一个可选的垃圾收集器。