取消引用 Box 时是否会发生内存泄漏?

Is memory leaked when a Box is dereferenced?

我发现当用 *Box::new(_) 移动取消引用的 Box 时,它不会调用 Deref::derefDerefMut::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)
    

I've learned that Box is an extraordinary struct, so that in the case of data move, it actually dereferences like a reference (without Deref trait).

事实并非如此,这才是重点。 Box alone has access to an intrinsic "deref move" feature which is not actually formalised or otherwise available.

During the movement, what happens to the memory allocated by Box in the heap? Is it freed?

是的。

How can I explicitly dereference a Box without Deref trait?

通过使用 *.

test(&(*a));

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

大括号 替换 parens 会 force moving the dereferenced value