Rust 智能指针(Rc)

std::rc::Rc

Rc代表引用计数

以下是标准库文档的介绍

Single-threaded reference-counting pointers. 'Rc’ stands for 'Reference Counted’.
The type Rc provides shared ownership of a value of type T, allocated in the heap. Invoking clone on Rc produces a new pointer to the same value in the heap.
When the last Rc pointer to a given value is destroyed, the pointed-to value is also destroyed.
Shared references in Rust disallow mutation by default, and Rc is no exception: you cannot generally obtain a mutable reference to something inside an Rc. If you need mutability, put a Cell or RefCell inside the Rc; see an example of mutability inside an Rc.
Rc uses non-atomic reference counting. This means that overhead is very low, but an Rc cannot be sent between threads, and consequently Rc does not implement Send. As a result, the Rust compiler will check at compile time that you are not sending Rcs between threads. If you need multi-threaded, atomic reference counting, use sync::Arc.

总结为以下几点:
+ Rc让一个值有多个所有者,调用clone产生一个指针指向该值
+ 当Rc指针全部销毁时,该值也销毁
+ 不能通过Rc获得可变引用
+ Rc是非原子引用,只能用于单线程,多线程用Arc

use std::rc::Rc;

fn main() {
    let five = Rc::new(5);
    let five1 = five.clone();
    //Rc实现了Deref trait,可以自动解引用,因此下面打印成功
    println!("{}", five1);
    //可以通过调用strong_count查看引用计数
    println!("{}", Rc::strong_count(&five1));
}

顺便介绍一下rc::Weak

标准库介绍

Weak is a version of Rc that holds a non-owning reference to the managed value. The value is accessed by calling upgrade on the Weak pointer, which returns an Option.

Since a Weak reference does not count towards ownership, it will not prevent the inner value from being dropped, and Weak itself makes no guarantees about the
value still being present and may return None when upgraded.

A Weak pointer is useful for keeping a temporary reference to the value within Rc without extending its lifetime. It is also used to prevent circular references between Rc pointers, since mutual owning references would never allow either Rc to be dropped. For example, a tree could have strong Rc pointers from parent nodes to children, and Weak pointers from children back to their parents.

The typical way to obtain a Weak pointer is to call Rc::downgrade.

  • Weak用于不拥有所有权的引用,通过调用upgrade调用值,这个方法返回一个Optical<Rc<T>>

  • Weak不能阻止值被丢弃,当值被丢弃时,调用upgrade时返回None

  • 使用Weak可以避免Rc的循环引用

  • 调用Rc::downgrade来获得一个Weak指针

use std::rc::Rc;

fn main() {
    let five = Rc::new(5);
    let weak_five = Rc::downgrade(&five);
    let strong_five: Option<Rc<_>> = weak_five.upgrade();
    println!("{}", strong_five.unwrap());
    println!("weak: {}, strong: {}", Rc::weak_count(&five), Rc::strong_count(&five));
}
(0)

相关推荐

  •  C++11中shared

    在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...

  • 为什么老外总是把颜值高的人叫作“A ten”?

    ten是一个常见的数词,意思就是10.但是你知道吗?除了10,ten还有其他用法. Markus Spiske/unsplash She is a ten她很漂亮 a ten十分:很完美 十进制是全球 ...

  • C和指针之字符串编程练习11(统计一串字符包含the的个数)

    C和指针之字符串编程练习11(统计一串字符包含the的个数)

  • C 11中智能指针的原理、使用、实现

    目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的 ...

  • 智能指针和所有权

    在编程语言中,对堆对象的内存管理是一个麻烦又复杂的问题.一不小心就会带来问题,比如JS里一直引用一个已经不使用的对象导致gc无法回收,或者C 里多个变量指向同一块内存导致重复释放.本文简单探讨一下关于 ...

  • C++智能指针 unique

    unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 定义于 memory (非memory.h)中, 命名空间 ...

  • (8条消息) C++ 智能指针 unique

    unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针.unique_ptr对象包装一个原始指针,并负责其生命周期.当该对象被销毁时, ...

  • c 11新特性之智能指针

    很多人谈到c++,说它特别难,可能有一部分就是因为c++的内存管理吧,不像java那样有虚拟机动态的管理内存,在程序运行过程中可能就会出现内存泄漏,然而这种问题其实都可以通过c++11引入的智能指针来 ...

  • 现代C一文读懂智能指针

    https://m.toutiao.com/is/JHS4MVf/ 智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr<T> :独占资源所有权的指针. st ...

  • Rust中的各种指针

    xtutujs.golang.rust.关注他49 人赞同了该文章Rust 中的指针大体可以分为以下四种:引用 references"胖指针 fat pointers"(该分类存有 ...

  • 5000元打造全套智能家居!小米带你享受未来生活│附清单

    对于很多人来讲,智能家居的定义只停留在买个产品能连上无线网络,能用手机APP操控就可以了的阶段,比如净化器,空调之类的产品,然而实际上仅停留在这个阶段的产品,具备了智能的基本能力,但仍然还要人操作,对 ...

  • DCIB数据中心智能母线(滑轨式)

    DCIB数据中心智能母线(滑轨式)鼎圣集团  百诺网络 2020-08-21 关注 DCIB数据中心智能母线(滑轨式)  一.概述 DCIB系列智能小母线为新型母线,又叫导轨式空气绝缘型智能母线槽 ...