首页 文章

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

提问于
浏览
2

来自Rust文档 .

into_raw函数使用一个框并返回原始指针 . 它不会破坏T或释放任何内存 .

在这段代码中:

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

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

2 回答

  • 4

    免责声明:@fjh在评论中指出,但值得一提 .

    内存安全性通常没有明确定义,因此为Rust Build 了特定的定义 . 它的要点是,对于Rust来说,内存安全意味着:只访问已分配和初始化的内存 .

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


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

  • 6

    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而不将其转换回盒子,你就会发生内存泄漏 .

相关问题