我已经认识到,当用*Box::new(_)
移动一个去引用的Box
时,它既不调用Deref::deref
,也不调用DerefMut::deref_mut
;它确实移动了值,这意味着*Box::new(_)
具有所有权,而不是引用的取消引用。
一个例子:
let a = Box::new(String::from("hello");
let b = *a;
我了解到Box
是一个特殊的结构,因此在数据移动的情况下,它实际上像引用一样取消引用(没有Deref
特性(。
在移动过程中,堆中
Box
分配的内存会发生什么变化?它被释放了吗?它被一堆零取代了吗?它是否仍然只是没有任何方式被访问?我知道
String::from
分配的内存将在b
下降时释放。我对数据str type hello
不感兴趣,我对大小为size of String
的内存感兴趣。如何明确取消引用没有
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将强制移动取消引用的值。