结论:Box<T> 用于堆分配和递归类型的单所有权场景;Rc<T> 用于单线程内多所有权共享(引用计数非原子);Arc<T> 用于跨线程共享(原子引用计数)。三者的选择轴是"所有者数量 × 是否跨线程"。

展开:Box 无运行时开销,解决两类问题——把大数据放堆上避免栈拷贝、让 List/Tree 这类递归类型有确定大小。Rc 通过 clone 增加计数、drop 减计数,归零时释放,适合图结构、多处只读共享;但它只提供共享不可变访问,要修改需配合 RefCellArcRc 的线程安全版,计数用原子操作,配合 Mutex/RwLock 实现跨线程共享可写。注意:Rc/Arc 形成循环引用会内存泄漏,需用 Weak 打破环。

use std::sync::{Arc, Mutex};
use std::thread;
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..4 {
    let c = Arc::clone(&counter); // 克隆 Arc,共享所有权
    handles.push(thread::spawn(move || {
        *c.lock().unwrap() += 1;
    }));
}
for h in handles { h.join().unwrap(); }

易错点:单线程不要用 Arc(原子操作有成本),跨线程不能用 Rc(不满足 Send,编译器会拒绝)。追问方向:Weak 的使用场景、Cow 何时更优。