消费盒子后谁负责释放内存

时间:2016-01-12 21:23:31

标签: rust

来自Rust文档。

  

into_raw函数使用一个框并返回原始指针。它   不会破坏T或解除分配任何记忆。

在此代码中:

fn main() {
    let b = Box::new("hello".to_owned());
    let a: *mut String = Box::into_raw(b);
}

我没有使用unsafe块,因此我们应该没有内存泄漏。因此,如果Box对象在消耗后没有责任释放内存,但是内存没有被释放并且可以进一步使用,并且原始指针不是由资源拥有,谁将释放内存?

2 个答案:

答案 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来说,内存安全意味着:只访问已分配和初始化的内存。

这个定义的结果是内存泄漏是安全的,因为它们不会导致悬空指针。不运行析构函数也被认为是安全的,因为它们不会违反内存安全性(尽管这可能会泄漏其他资源)。

Box::into_raw主要用于与FFI的交互,以便能够跨语言边界转移所有权,正如其文档中所提到的,释放内存的正确方法是使用Box::from_raw来重新创建一个Box