取消引用Box时内存是否泄漏



我已经认识到,当用*Box::new(_)移动一个去引用的Box时,它既不调用Deref::deref,也不调用DerefMut::deref_mut;它确实移动了值,这意味着*Box::new(_)具有所有权,而不是引用的取消引用。

一个例子:

let a = Box::new(String::from("hello");
let b = *a;

我了解到Box是一个特殊的结构,因此在数据移动的情况下,它实际上像引用一样取消引用(没有Deref特性(。

  1. 在移动过程中,堆中Box分配的内存会发生什么变化?它被释放了吗?它被一堆零取代了吗?它是否仍然只是没有任何方式被访问?

    我知道String::from分配的内存将在b下降时释放。我对数据str type hello不感兴趣,我对大小为size of String的内存感兴趣。

  2. 如何明确取消引用没有Deref特征的Box?当我尝试它时,它会通过调用Deref::deref自动借用Box

    let a = Box::new(String::from("hello"));
    fn test(i: &String) {}
    test(&(*a));
    

    编译器推断不需要移动*a,所以它似乎是通过特性而不是直接引用的。

    这个案例成功地消耗了盒子和字符串:

    let a = Box::new(String::from("hello"));
    fn test(i: String) {}
    test(*a)
    

我了解到Box是一个非凡的结构,因此在数据移动的情况下,它实际上像引用一样取消引用(没有Deref特性(。

没有,这才是重点。CCD_;取消移动";实际上没有正式化或以其他方式可用的功能。

在移动过程中,Box在堆中分配的内存会发生什么变化?它被释放了吗?

是。

如何显式取消引用没有Deref特征的Box?

使用*

测试(&(*a((;

parens在这里没有任何用处,这只是重新调用指针。

大括号替换parens将强制移动取消引用的值。

最新更新