当 Box 被取消引用时,内存会泄漏吗?

kwo*_*yul -1 memory-leaks smart-pointers dereference rust box

我已经认识到,当移动取消引用Box的时*Box::new(_),它不会调用Deref::derefDerefMut::deref_mut;它确实移动了值,这意味着*Box::new(_)拥有所有权,而不是对引用的取消引用。

一个例子:

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

let b = *a;
Run Code Online (Sandbox Code Playgroud)

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

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

    我知道分配的内存在删除String::from时将被释放b。我对数据并不好奇str type hello,我对大小为 的内存感到好奇size of String

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

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

    编译器推断不需要 move *a,因此看起来它是通过特征取消引用,而不是直接取消引用。

    本例成功消耗了盒子和字符串:

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

Mas*_*inn 5

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

事实并非如此,这才是重点。Box单独可以访问内在的“取消引用移动”功能,该功能实际上并未正式化或以其他方式可用

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

是的。

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

通过使用*

测试(&(*a));

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

用大括号替换括号将强制移动解除引用的值