有没有办法导致内存泄漏?我知道,即使在像JavaScript这样的垃圾收集语言中,也存在内存泄漏的边缘情况,Rust中是否存在这样的情况?

推荐答案

是的,在Rust中泄漏内存就像调用std::mem::forget函数一样简单.

如果创建的周期为shared references,也可能会泄漏内存:

Rc个指针之间的循环永远不会被释放.因此,Weak用于中断循环.例如,一棵树可以有Rc个从父 node 到子 node 的强指针,以及Weak个从子 node 到父 node 的强指针.

也可以使用Box::leak创建静态引用,或者在FFI的情况下使用Box::into_raw.


实际上,在系统编程语言中,您需要能够创建内存泄漏,否则,例如在FFI情况下,您的资源在被发送到另一种语言中使用后将被释放.


所有这些例子都表明,内存泄漏不会 destruct 由 rust 迹保证的内存安全.然而,可以安全地假设,在Rust中,您没有任何内存泄漏,除非您做了非常具体的事情.

此外,请注意,如果对内存泄漏采用松散的定义,则有无限种方法可以创建内存泄漏,例如,在容器中添加一些数据,而不释放未使用的数据.

Rust相关问答推荐

使用InlineTables序列化toml ArrayOfTables

如何在tauri—leptos应用程序中监听后端值的变化?""

关联类型(类型参数)命名约定

限制未使用的泛型导致编译错误

制作一片连续整数的惯用Rust 方法?

异步函数返回的future 生存期

在文件链实施中绕过borrow 判断器

不能在Rust中使用OpenGL绘制三角形

Rust ndarray:如何从索引中 Select 数组的行

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

需要一个有序向量来进行 struct 初始化

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

trait 对象指针的生命周期

`map` 调用在这里有什么用吗?

如何获得对数组子集的工作可变引用?

深度嵌套枚举的清洁匹配臂

在 Traits 函数中设置生命周期的问题

为什么这个值在上次使用后没有下降?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

相互调用的递归异步函数:检测到循环