`

rust智能指针

    博客分类:
  • rust
 
阅读更多
Box,Rc,RefCell都是不可变借用,只不过RefCell是运行时检查,Box和RefCell是可变的,Rc不可变但同一个数据可以有多个拥有者

Box<T>类型具有已知大小并指向在堆上分配的数据。该 Rc<T>类型跟踪堆上数据的引用次数,以便数据可以有多个所有者。具有内部可变性的RefCell<T>类型为我们提供了一种类型,当我们需要不可变类型但需要更改该类型的内部值时可以使用该类型;它还在运行时而不是在编译时强制执行借用规则

use std::ops::Deref;
use std::rc::Rc;
use std::cell::RefCell;

enum List {
    Cons(i32, Box<List>),
    Nil,
}

#[derive(Debug)]
enum RcList {
    RcCons(Rc<RefCell<i32>>, Rc<RcList>),
    RcNil,
}

use crate::RcList::{RcCons, RcNil};

use crate::List::{Cons, Nil};

struct MyBox<T>(T);

impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}

impl<T> Deref for MyBox<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn hello(name: &str) {
    println!("Hello, {}!", name);
}

struct CustomSmartPointer {
    data: String,
}

impl Drop for CustomSmartPointer {
    fn drop(&mut self) {
        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
    }
}

fn main() {
    //普通智能指针
    let num = Box::new(10);
    println!("{}",num);
    let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));

    let mut x = 5;
    let mut y = &x;
    println!("y:{}",*(y.deref()));
    let z = Box::new(x);
    //z = Box::new(11);
    //*y = 10;  //借用不能修改
    //x = 10;

    assert_eq!(5, x);
    assert_eq!(5, *y);

    let m = MyBox::new(String::from("Rust"));
    hello(&m);
    hello(&(*m)[..]);

    let c = CustomSmartPointer {
        data: String::from("my stuff"),
    };
    //c.drop(); //不能手动调用
    let d = CustomSmartPointer {
        data: String::from("other stuff"),
    };
    println!("CustomSmartPointers created.");

    let value = Rc::new(RefCell::new(5));
    let a = Rc::new(RcCons(Rc::clone(&value), Rc::new(RcNil)));
    let b = RcCons(Rc::new(RefCell::new(3)), Rc::clone(&a));
    let c = RcCons(Rc::new(RefCell::new(4)), Rc::clone(&a));

    *value.borrow_mut() += 10;
    println!("a after = {:?}", a); //这个时候a的值就变了
    println!("b after = {:?}", b);
    println!("c after = {:?}", c);

    let r = Rc::new(100);
    let r1 = r;
    let r2 = r1;
    println!("r:{}",Rc::strong_count(&r2));
}

10
y:5
Hello, Rust!
Hello, Rust!
CustomSmartPointers created.
a after = RcCons(RefCell { value: 15 }, RcNil)
b after = RcCons(RefCell { value: 3 }, RcCons(RefCell { value: 15 }, RcNil))
c after = RcCons(RefCell { value: 4 }, RcCons(RefCell { value: 15 }, RcNil))
Dropping CustomSmartPointer with data `other stuff`!
Dropping CustomSmartPointer with data `my stuff`!
分享到:
评论

相关推荐

    Rust 智能指针基础用法总结

    本资源总结了Rust中的常见智能指针用法,和示例代码。 例如Box,Raw Pointer裸指针 Rc计数指针 Cell与RefCell内部可变性 Weak指针 Arc原子计数指针 和Mutex锁 的用法和示例

    rust-objc-id:用于Objective-C参考计数的Rust智能指针

    Rust智能指针,用于Objective-C参考计数。 为了确保在适当的时间保留和释放Objective-C对象,我们可以使用Id结构。 要实施别名规则,可以拥有或共享一个Id ; 如果它是拥有的,则意味着Id是对该对象的唯一引用,...

    深入Rust的智能指针:内存安全的得力助手

    ### 深入Rust的智能指针:内存安全的得力助手 #### 1. 智能指针简介 智能指针是Rust语言中的一种重要特性,旨在为开发者提供安全且高效的堆上数据操作方式。智能指针不仅能够帮助管理内存,还能在编译时提供额外的...

    Rust学习笔记_78实用知识库分享

    4. Rust智能指针:Rust学习笔记Day 13-15讲述了Rust的智能指针,包括Box、Cow等智能指针的使用和实现。 5. Rust集合容器:Rust学习笔记Day 16-19讲述了Rust的集合容器,包括数组、链表、哈希表等集合容器的使用和...

    Rust 程序设计语言 简体中文版.pdf

    第二章详细介绍了 Rust 的内存管理机制,包括所有权系统、借用检查器、智能指针等概念。 第三章讲解了 Rust 的并发编程机制,包括线程、异步编程、 Atomic 类型等。 第四章介绍了 Rust 的 error handling 机制,...

    shredder:垃圾收集了Rust的智能指针

    碎纸机 shredder是一个提供垃圾回收智能指针Gc 。 这在您希望共享访问某些数据但数据结构中具有不可预测的周期时非常有用。 (因此,Arc不适合。) shredder具有以下功能: 安全:即时检测错误情况,并保护您免受...

    Rust参考手册 中文版(带完整目录)

    2. **类型系统**:深入讨论Rust的类型系统,包括静态类型、枚举、结构体、元组、引用和智能指针。Rust的类型系统是其强大安全性的重要组成部分。 3. **函数和闭包**:讲解Rust中的函数定义、参数传递、返回值以及...

    rust-in-action-code.tar.gz

    9. **智能指针**:如`Box`、`Rc`、`Arc`等,它们是Rust中对内存管理的高级抽象,提供了垃圾回收的类似功能,但仍然保持了高性能。 10. **Cargo**:Rust的标准构建和包管理工具,它负责管理依赖、构建项目以及运行...

    the-rust-book

    本章将深入探讨 Rust 中的指针类型及其用法,包括智能指针、生命周期等概念,这些都是 Rust 高级特性的重要组成部分。 #### 第三部分:高级部分 这一部分涉及 Rust 的一些高级特性,如更复杂的类型系统、异步编程...

    RustChinaConf2020-05.meepo-《Rust在飞书客户端的智能化探索》.pdf

    【Rust在飞书客户端的智能化探索】 在互联网行业中,技术的发展日新月异,而Rust作为一种系统级编程语言,近年来受到了广泛的关注。RustChinaConf2020的议题“Rust在飞书客户端的智能化探索”深入讨论了Rust如何在...

    Rust 嵌入式开发教程之 STM32F103

    Rust 的内存管理机制确保了零成本抽象和无悬挂指针,这使得它在处理硬件资源有限的嵌入式系统时,能够避免常见的编程错误,如空指针异常和数据竞争。此外,Rust 的静态类型和所有权模型确保代码在编译时就能捕获许多...

    Rust 程序设计语言中文教程

    智能指针是Rust中一种特殊的类型,它可以拥有它指向的数据。 Rust支持面向对象编程,它提供特质对象(trait objects)来实现动态分派。在Rust中可以实现设计模式,例如单例模式、策略模式等。 Rust的测试机制也很...

    Rust常见面试题.pdf

    - **所有权与引用**:Rust的内存管理是基于所有权的概念,而C++主要依靠智能指针和手动管理。 - **抽象成本**:Rust的零成本抽象意味着其提供的高级特性不会带来额外的性能损失。 - **标准库**:Rust的标准库设计...

    RUST program language

    - **智能指针**:智能指针是 Rust 中一项重要的安全特性,用于管理动态分配的内存。 - **无惧并发**:Rust 设计之初就考虑了并发安全性问题,本部分将详细介绍 Rust 如何提供安全的并发支持。 - **面向对象编程在 ...

    Rust语言学习万字指南!.md

    - 指针(引用、原生指针、智能指针) - 并发安全 - 函数、闭包、迭代器等语法特性 3. Rust属性的使用 4. Rust内存管理原理 5. Unicode在Rust中的应用 6. 字符串对象常用方法总结 是一份内容丰富、细节详尽的...

    The Rust programming language

    1. 内存安全:Rust通过其独特的所有权(Ownership)、借用(Borrowing)和生命周期(Lifetimes)系统来确保内存安全,避免内存泄漏和空悬指针等错误。 2. 并发:Rust的并发设计非常独特,支持无数据竞争(Data Race...

    Rust container cheat sheet.pdf

    在Rust中,容器(或称为集合)主要分为两大类:基本类型和智能指针。 基本类型通常包括: - Vec&lt;T&gt;:动态数组,可在栈上存储一系列相同类型的数据。 - [T]:切片,是对Vec或数组的一部分的引用,不拥有数据。 - ...

    RUST中文教程

    - **智能指针**:盒子作为Rust中的智能指针之一,可以帮助自动管理内存。 #### 九、所有权转移语义 **所有权转移**: - **值移动**:当把一个值从一个位置移动到另一个位置时,原位置的值将不再有效。 - **所有权...

    run_rust运行环境

    VSCode的强大之处在于其丰富的扩展生态系统,通过安装特定的插件,如“Rust (rls)”或“Rust Analyzer”,你可以获得代码智能感知、自动完成、错误检查和格式化等功能,极大提升了开发效率。 要使用VSCode运行Rust...

Global site tag (gtag.js) - Google Analytics