*const T
和*mut T
在Rust中被称为“裸指针”
可以绕过Rust的安全保障
有一些你需要记住的裸指针不同于其它指针的地方。它们是:
- 不能保证指向有效的内存,甚至不能保证是非空的(不像
Box
和&
); - 没有任何自动清除,不像
Box
,所以需要手动管理资源; - 是普通旧式类型,也就是说,它不移动所有权,这又不像
Box
,因此Rust编译器不能保证不出像释放后使用这种bug; - 缺少任何形式的生命周期,不像
&
,因此编译器不能判断出悬垂指针; - 除了不允许直接通过
*const T
改变外,没有别名或可变性的保障。
fn main() { let x = 5; let raw = &x as *const i32; //当你解引用一个裸指针,你要为它并不指向正确的地方负责。为此,你需要unsafe: let points_at = unsafe { *raw }; println!("raw points at {}", points_at); }
参考:https://www.cntofu.com/book/55/content/Raw%20Pointers%20%E8%A3%B8%E6%8C%87%E9%92%88.md
https://www.jianshu.com/p/72d9965bb10d
https://blog.51cto.com/u_15127658/2783296
https://doc.rust-lang.org/stable/std/primitive.pointer.html