kwo*_*yul -1 memory-leaks smart-pointers dereference rust box
我已经认识到,当移动取消引用Box的时*Box::new(_),它不会调用Deref::deref或DerefMut::deref_mut;它确实移动了值,这意味着*Box::new(_)拥有所有权,而不是对引用的取消引用。
一个例子:
let a = Box::new(String::from("hello");
let b = *a;
Run Code Online (Sandbox Code Playgroud)
我了解到这Box是一个非凡的结构,因此在数据移动的情况下,它实际上像引用一样取消引用(没有Deref特征)。
Box移动过程中,堆中分配的内存发生了什么变化?它被释放了吗?是用一堆零代替的吗?是否仍然没有任何访问方式?
我知道分配的内存在删除String::from时将被释放b。我对数据并不好奇str type hello,我对大小为 的内存感到好奇size of String。
我如何显式取消引用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)
我了解到 Box 是一个非凡的结构,因此在数据移动的情况下,它实际上像引用一样取消引用(没有 Deref 特征)。
事实并非如此,这才是重点。Box单独可以访问内在的“取消引用移动”功能,该功能实际上并未正式化或以其他方式可用。
移动过程中,Box在堆中分配的内存发生了什么变化?它被释放了吗?
是的。
如何在没有 Deref 特征的情况下显式取消引用 Box?
通过使用*。
测试(&(*a));
括号在这里没有任何用处,这只是重新借用了指针。
用大括号替换括号将强制移动解除引用的值。