rust 借用检查器如何处理指针

问题描述 投票:0回答:1

使用指针时,借用检查器的行为如何?借用检查器会根本不起作用还是会导致问题?我的猜测是,当从指针中删除引用时,不会发生任何事情。

我刚刚开始使用不安全的 rust,并希望确保不会导致任何内存泄漏或未定义的行为

let ptr = Box::into_raw(Box::new(value));
let a = unsafe { &*ptr };
let b = unsafe { &*ptr };
drop(a);
drop(b);
pointers rust borrow-checker
1个回答
0
投票

您编写的代码不会删除任何内容,因为您只是删除引用。在 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 更严格。既然您提到这是您不安全旅程的开始,这里有一些有用的资源:

  • The Rustonomicon:不完整但有用的一般参考
  • Miri:一个很棒的测试器,用于捕获不安全代码的问题。运行速度比正常执行慢很多
  • 固定:如果你正在搞乱异步不安全,你真的需要理解这一点
    • 也很好地理解异步,我想每个人都应该知道这一点
    • 在我真正得到它之前,我必须编写自己的异步执行器
    • 更多好书
    • 理解这一点也会导致自引用结构,如果你走得那么远,记住下降顺序很重要
  • Send
    Sync
    :进入多线程所需
    • 更好地学习这一点的最佳方法是尽可能避免
      Mutex
      (您几乎永远不需要它们来处理一些奇特的数据结构/线程布局)
    • Atomics 速度非常快。一个常见的说法是它们很慢,但比
      Mutex
      快很多数量级。时间也是恒定的(除非你执行 CAS 循环)
© www.soinside.com 2019 - 2024. All rights reserved.