智能指针

Rust提供了两种用于引用计数的智能指针:

  • Rc 引用计数的指针,线程不安全。
  • Arc 就线程安全的Rc。原子的引用计数指针,线程安全的。

Rust内存资源同一时刻只能有一个所有权拥有者。Rc和Arc使用引用计数法,让同一时刻实现资源有多个所有者权拥有者。

使用Rc

Rc 用于同一线程内部,通过 use std::rc::Rc 来引入。它有以下几个特点:

  • 用 Rc 包装起来的类型对象,是只读的,是不可变的。
  • 最后一个拥有者的作用域结束,则资源会被自动回收,这个生命周期是在编译期就确定下来的;
  • Rc 只能用于同一线程内部,不能用于线程之间的对象共享(不能跨线程传递);
  • Rc 实际上是一个指针,它不影响包裹对象的方法调用形式(即不需要先解开包裹再调用值)。
use std::rc::Rc;

let x = Rc::new(5i);
let y = x.clone();

当x和y都超出作用域后,内存即自动释放。

注意,如果存在循环引用。Rust无法帮助我们释放内存。从而引发内存泄漏。

使用 Weak 解决循环引用。

Arc

Arc 是原子引用计数,是 Rc 的多线程版本。Arc 通过 std::sync::Arc 引入。

特点:

  • Arc 可跨线程传递,用于跨线程共享一个对象;
  • 用 Arc 包裹起来的类型对象,对可变性没有要求;
  • 最后一个拥有者的作用域结束,则资源会被自动回收,这个生命周期是在编译期就确定下来的;
  • Arc 实际上是一个指针,它不影响包裹对象的方法调用形式(即不需要先解开包裹再调用值。);
  • Arc 对于多线程的共享状态几乎是必须的(减少复制,提高性能)。

results matching ""

    No results matching ""