来自Rust文档。
into_raw函数使用一个框并返回原始指针。它 不会破坏T或解除分配任何记忆。
在此代码中:
fn main() {
let b = Box::new("hello".to_owned());
let a: *mut String = Box::into_raw(b);
}
我没有使用unsafe
块,因此我们应该没有内存泄漏。因此,如果Box对象在消耗后没有责任释放内存,但是内存没有被释放并且可以进一步使用,并且原始指针不是由资源拥有,谁将释放内存?
答案 0 :(得分:6)
https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.into_raw指定:"调用此函数后,调用者负责以前由Box管理的内存,特别是调用者应正确销毁T并释放内存。正确的方法是使用Box :: from_raw函数将指针转换回Box,因为Box没有指定内存的分配方式。"
因此,如果你让你的原始指针离开scobe而不将它转换回一个盒子,你就会发生内存泄漏。
答案 1 :(得分:4)
免责声明:@fjh在评论中指出,但值得一提。
内存安全性一般没有明确定义,因此为Rust建立了特定的定义。它的要点是,对于Rust来说,内存安全意味着:只访问已分配和初始化的内存。
这个定义的结果是内存泄漏是安全的,因为它们不会导致悬空指针。不运行析构函数也被认为是安全的,因为它们不会违反内存安全性(尽管这可能会泄漏其他资源)。
std::mem::forget
由this RFC std::rc::Rc
或std::sync::Arc
Box::into_raw
主要用于与FFI的交互,以便能够跨语言边界转移所有权,正如其文档中所提到的,释放内存的正确方法是使用Box::from_raw
来重新创建一个Box
。