Mik*_*lla 5 garbage-collection pointers rust
Rust编程语言,第一版说Rust没有垃圾收集器:
它没有垃圾收集器就维持了这些目标
但是,在讨论选择保证时,它还说:
Rc<T>是引用计数指针.换句话说,这让我们有多个"拥有"指向同一数据的指针,当所有指针都超出范围时,数据将被删除(析构函数将被运行).
据我所知,这正是指针在Python等垃圾收集语言中的工作原理.
我认为垃圾收集是任何阻止手动释放动态分配内存的过程.我想我不明白Rust指南认为垃圾收集是什么.
She*_*ter 12
我认为垃圾收集是任何阻止手动释放动态分配内存的过程
然后Rust确实有"垃圾收集"!
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!
Run Code Online (Sandbox Code Playgroud)
当thing和things走出去的范围(在这种情况下,在方法的结尾),那么他们已经分配的内存将被释放给你.
Rc并Arc允许比这更多的灵活性; 你应该给他们的文档阅读以了解更多.
除了@Manishearth的答案之外,还有这个细节(强调我的):
在最后一个所有者的生命周期结束时自动释放
在许多垃圾收集语言中,垃圾收集在其他代码的带外发生.在Rust中,释放的位置将是已知的.
鉴于此Java:
public static ArrayList alpha()
{
return new ArrayList();
}
public static void beta()
{
alpha(); // Unused result
}
Run Code Online (Sandbox Code Playgroud)
我不相信,你可以说肯定当ArrayList中会从内存中删除.在等效锈代码,你知道的Arc或者Rc因为它超出范围将尽快销毁.
关于Rust现在如何改变,这篇文章有点陈旧,但它强调了Rust没有GC意味着什么.只有RAII和所有权是Rust固有的.它们有助于编写类似参考计数的GC,例如Rc和Arc,但这些不是语言的一部分,它们是标准库的一部分.它带来了巨大的变化.
如果您考虑在Rust中编写操作系统,则不能在代码的一部分中使用任何形式的GC或使用标准库.在这个层面上,重要的是要知道什么是语言的一部分,什么不是.举个简单的例子,请看这里.
相反,在诸如Java或Python之类的语言中,您无法阻止您的代码使用GC,因为它通过语言设计隐式使用它.
在Rust中,就像在C/C++中一样,GC是库中的一部分,它的使用是明确的.
Rc没有周期集合。如果创建引用循环,则在尝试增加引用计数时,程序可能会崩溃。
尽管从技术上讲,这也算作垃圾收集器,但它并不是通用的垃圾收集器,因为您对其包含的类型有限制。