使用指针时,借用检查器的行为如何?借用检查器会根本不起作用还是会导致问题?我的猜测是,当从指针中删除引用时,不会发生任何事情。
我刚刚开始使用不安全的 rust,并希望确保不会导致任何内存泄漏或未定义的行为
let ptr = Box::into_raw(Box::new(value));
let a = unsafe { &*ptr };
let b = unsafe { &*ptr };
drop(a);
drop(b);
您编写的代码不会删除任何内容,因为您只是删除引用。在 Rust 中,删除引用基本上是无操作的。您还通过创建对无效值的引用来违反 Rust 的规则。稍微改变它也会导致双重释放(甚至是三次释放,因为原始盒子在不安全代码之前被丢弃)。
let ptr = Box::into_raw(Box::new(value));
let a = unsafe { Box::from_raw(ptr) };
let b = unsafe { Box::from_raw(ptr) };
drop(a);
drop(b);
不安全代码告诉 Rust 让你处理安全问题。尽管感觉自由度相同,但要求比 C 更严格。既然您提到这是您不安全旅程的开始,这里有一些有用的资源:
Send
和 Sync
:进入多线程所需
Mutex
(您几乎永远不需要它们来处理一些奇特的数据结构/线程布局)Mutex
快很多数量级。时间也是恒定的(除非你执行 CAS 循环)