在《铁 rust 》一书中,在Memory and Allocation的部分,它说:

GC跟踪并清理不再使用的内存,我们不需要考虑它……

Ruust走了一条不同的路:一旦拥有它的变量超出作用域,就会自动返回内存.

因此,在RuST中,内存会自动释放(与c不同)…但这不就是垃圾收集者的工作吗. 那么,Rust的内存管理与通常的GC有什么不同呢?

推荐答案

垃圾收集器解决了一个不同的问题.

当对象超出范围时,它们不会简单地释放对象.如果您同时在某个位置存储了对对象的引用,则即使对象超出范围,它们也会使对象保持活动状态.

Rust禁止您(在编译时)保留Any引用,因此它可以安全地释放对象.垃圾收集器最终将运行复杂的算法来判断对象是否还有任何活动引用.(还可以检测未使用的循环引用,例如,当两个对象彼此指向,但没有其他对象持有对它们的引用时.)

这可能会导致所谓的"GC暂停",中断正常程序一段不确定的时间.另一方面,作为程序员,它允许您简单地(几乎)将引用放在您喜欢的任何位置,而无需担心.

Rust相关问答推荐

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

定义采用更高级类型泛型的性状

编译项目期间使用Cargo生成时出现rustc错误

如何使用盒装枚举进行模式匹配?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

如何将单个 struct 实例与插入器一起传递到Rust中的映射

铁 rust 中双倍或更多换行符的更好练习?

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

write_buffer 不写入缓冲区而是输出零 WGPU

Rust:为什么 Pin 必须持有指针?

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

使用 Rust 从 Raspberry Pi Pico 上的 SPI 读取值

如何在 Emacs Elisp 中获得类似格式化的 LSP?

使用部分键从 Hashmap 中检索值

从 Cranelift 发出 ASM

有没有办法阻止 rust-analyzer 使非活动代码变暗?

Rust 中的通用 From 实现

当引用不再被borrow 时,Rust 不会得到它

为移动和借位的所有组合实现 Add、Sub、Mul、Div