来自Rust文档 .
into_raw函数使用一个框并返回原始指针 . 它不会破坏T或释放任何内存 .
在这段代码中:
fn main() {
let b = Box::new("hello".to_owned());
let a: *mut String = Box::into_raw(b);
}
我没有使用 unsafe
块,因此我们应该没有内存泄漏 . 因此,如果Box对象在消耗后没有责任释放内存,但是内存没有被释放并且可以进一步使用,并且原始指针不是由资源拥有的,谁将释放内存?
2 回答
免责声明:@fjh在评论中指出,但值得一提 .
内存安全性通常没有明确定义,因此为Rust Build 了特定的定义 . 它的要点是,对于Rust来说,内存安全意味着:只访问已分配和初始化的内存 .
这个定义的结果是内存泄漏是安全的,因为它们不会导致悬空指针 . 不运行析构函数也被认为是安全的,因为它们不会违反内存安全性(尽管这可能会泄漏其他资源) .
std::mem::forget由this RFC稳定
使用
std::rc::Rc
或std::sync::Arc
的循环始终可能泄漏......
Box::into_raw
主要用于与FFI交互,以便能够跨语言边界转移所有权,正如其文档中提到的,释放内存的正确方法是使用Box::from_raw
从中重新创建Box
.https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.into_raw指定:"After call to this function, caller is responsible for the memory previously managed by Box, in particular caller should properly destroy T and release memory. The proper way to do it is to convert pointer back to Box with Box::from_raw function, because Box does not specify, how memory is allocated."
因此,如果你让你的原始指针离开scobe而不将其转换回盒子,你就会发生内存泄漏 .