Rc和Arc很相似,唯一的区别就是Arc在线程之间共享是安全的。Arc全名是atomic reference count。而rc不是线程安全的,但是效率更高。如果你不需要在线程之间共享指针,没有必要耗费性能使用Arc,你应该用Rc,rust会阻止你跨线程传递Rc。
对任意类型T,Rc<T>是一个指向堆空间T类型并且附上引用计数(计数值也在堆空间上)的指针。克隆Rc<T>类型并不会克隆堆空间上T类型的数据,它只是简单的创建另外一个指针指向它。并把引用计数器加1。当最后一个存在的Rc被释放的时候,堆空间上T类型的数据才释放。一个Rc<T>类型的值可以直接调用T类型的方法。Rc类型的值是不可变的。rust的内存和线程安全保证依赖于变量的使用限制,不能同时是共享的和可变的。Rc变量是共享所有权的,所以不能是可变的。引用计数类型内存管理的一个已知问题是变量相互引用造成都得不到释放引起内存泄露。在rust中造成引用循环需要一个旧值指向一个新值,而旧值需要可变,但是rust的Rc类型为不可变,所以正常情况下不会存在引用循环。然而rust的确存在创建引用循环的方法,如果结合interior mutability和Rc类型,可以创建引用循环导致内存泄露。你可以用std::rc::Weak创建弱引用Rc类型来防止引用循环。
