Pointers 锈迹如何';s Arc和Rc类型与垃圾收集不同?

Pointers 锈迹如何';s Arc和Rc类型与垃圾收集不同?,pointers,garbage-collection,rust,Pointers,Garbage Collection,Rust,表示Rust没有垃圾收集器: 它在没有垃圾收集器的情况下保持这些目标 然而,其中也提到: Rc是一个引用计数指针。换句话说,这让我们有多个指向同一数据的“拥有”指针,当所有指针都超出范围时,数据将被删除(析构函数将被运行) 据我所知,这正是指针在像Python这样的垃圾收集语言中的工作方式 我认为垃圾收集是任何过程,不需要手动分配动态分配的内存。我想我不明白Rust指南认为什么是垃圾收集。Rc没有循环收集。如果创建一个引用循环,当程序试图增加refcount时,可能会导致程序崩溃 虽然从技术上讲

表示Rust没有垃圾收集器:

它在没有垃圾收集器的情况下保持这些目标

然而,其中也提到:

Rc
是一个引用计数指针。换句话说,这让我们有多个指向同一数据的“拥有”指针,当所有指针都超出范围时,数据将被删除(析构函数将被运行)

据我所知,这正是指针在像Python这样的垃圾收集语言中的工作方式


我认为垃圾收集是任何过程,不需要手动分配动态分配的内存。我想我不明白Rust指南认为什么是垃圾收集。

Rc
没有循环收集。如果创建一个引用循环,当程序试图增加refcount时,可能会导致程序崩溃

虽然从技术上讲,这也算是一个垃圾收集器,但它不是一个通用的垃圾收集器,因为您对它可以包含的类型有限制

我认为垃圾收集是一个过程,不需要手动分配动态分配的内存

。 那么Rust确实有“垃圾收集”

thing
things
超出范围时(在本例中,在方法末尾),它们分配的内存将为您释放

Rc
Arc
允许更大的灵活性;你应该读一读,了解更多


除了@Manishearth的答案外,还有以下细节(我的重点):

在最后一个所有者的生命周期结束时自动释放

在许多垃圾收集语言中,垃圾收集与代码的其余部分一起在带外进行。在Rust中,将知道解除分配的位置

考虑到这一点:

public static ArrayList alpha()
{
    return new ArrayList();
}

public static void beta()
{
    alpha(); // Unused result
}

我不相信你能肯定地说ArrayList何时会从记忆中删除。在等效的Rust代码中,您知道
Arc
Rc
一旦超出范围就会被破坏。

如果您坚持正确,垃圾收集器会收集垃圾。它收集要释放的内存位置列表。另一方面,Rc/Arc则不是,所以我认为你不能称之为垃圾收集

但是rust有
std::gc
模块,所以Year rust现在实际上有一个可选的垃圾收集器。

关于rust现在是如何变化的,这篇文章有点旧,但它强调了rust没有gc意味着什么。只有RAII和所有权是生锈的本质。它们有助于编写引用计数类似的GCs,如Rc和Arc,但它们不是语言的一部分,它们是标准库的一部分。这会带来巨大的不同

<>如果你认为写一个操作系统生锈,你不能在你的代码中使用任何形式的GC或者使用标准库。在这个层次上,了解什么是语言的一部分和什么不是很重要。举个简单的例子,看看

相反,在Java或Python等语言中,您不能阻止代码使用GC,因为它通过语言设计隐式地使用GC


在Rust中,就像在GC中一样,它是一个库的一部分,它的用途是明确的。

你能澄清一下“你对它可以包含的类型有限制”是什么意思吗?@MikeVella我不能有循环引用。没有内置的限制,但这是您应该遵循的限制。我的理解是,
Rc
/
Arc
不处理循环的事实不会自动取消它作为垃圾收集器的资格。@Shepmaster是的,我在回答中提到,然而,当人们问锈是否有GC时,他们指的是收集GC的循环。这是误导性的,因此我们只是说Rust没有GC。refcounting GC也很容易在树外实现,因此成本较低(因此可以说,所有带指针的面向对象语言都有refcounting GC),然而,一个好的循环收集GC通常需要与运行时和all集成,并且实现起来并不重要——当人们要求使用GC时,这就是他们所要求的。@Davidoundy不,你可以使用
Rc
RefCell
std::gc
在0.11和0.12版本之间创建循环。IIRC,
gc
从来没有正确实现过,它只是
Rc
伪装的。你的定义将“垃圾收集”本身与“自动内存管理。“自动内存管理可以参考任何数量的非手动内存管理方法。垃圾收集就是这样一种方法:据我所知,对于引用计数是否算作垃圾收集的一种形式,从来没有真正达成共识。即使是这样,它与其他形式的比较是如此的不同,以至于这种比较是没有用的。如果考虑标准库中的可选RAII动力引用计数智能指针,因为垃圾被收集起来,那么C++也被垃圾收集。这是指针在Python中的工作方式。除了引用计数,Python还有一个用于引用周期的回退GC。有关引用周期的详细信息:。
public static ArrayList alpha()
{
    return new ArrayList();
}

public static void beta()
{
    alpha(); // Unused result
}