美文网首页
Box与解引用

Box与解引用

作者: 简书网abc | 来源:发表于2021-09-03 20:44 被阅读0次

1. 智能指针是box

//1、最简单最直接的智能指针是box,其类型为Box<T>。box允许将值放在堆上而不是栈上,
// 留着栈上的则是指向堆数据的指针。
// 除了数据被存储在堆上外,box没有任何性能损失。
//
//2、box适合用于如下场景: (单一所有权, 非线程安全,编译期检查)
//(1)当有一个在编译时未知大小的类型,而又需要再确切大小的上下文中使用这个类型值的时候;
// (举例子:在一个list环境下,存放数据,但是每个元素的大小在编译时又不确定)
//(2)当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候;
//(3)当希望拥有一个值并只关心它的类型是否实现了特定trait而不是其具体类型时。
fn main() {
    let b = Box::new(5); //b存储于栈上,5存储在堆上,b指向5所在的内存
    println!("b = {}", b);
    println!("Hello, world!");
}

2. 实现Deref trait

use std::ops::Deref;

struct MyBox<T>(T);
impl <T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}
// 自定义结构体需要实现该 Deref trait, 才能被解引用.
impl <T> Deref for MyBox<T> {
    type Target = T;
    fn deref(&self) -> &T {
        &self.0
    }
}

fn main() {
    let x = 5;
    let y = MyBox::new(x);

    assert_eq!(5, x);
    assert_eq!(5, *y);   // 解引用
}

3. 使用 Drop Trait 运行清理代码

引用文档: 
https://rust.bootcss.com/ch15-03-drop.html
//1、Drop trait类似于其它语言中的析构函数,当值离开作用域的时候执行此函数的代码。

struct Dog {
    name: String,
}
impl Drop for Dog {
    fn drop(&mut self) {
        println!("dog {} leave.", self.name);
    }
}

fn main() {
    let a = Dog{name: String::from("wangcai")};
    {
        let b = Dog{name: String::from("dahuang")};
        println!("0++++++++++++++++++++");
    }   // 在此会调用析构函数

    drop(a);  //这里手工调用析构函数
    println!("1++++++++++++++++++");
}

//结果:
// 0++++++++++++++++++++
// dog dahuang leave.
// dog wangcai leave.
// 1++++++++++++++++++

相关文章

  • Box与解引用

    1. 智能指针是box 2. 实现Deref trait 3. 使用 Drop Trait 运行清理代码

  • Perl notes

    Perl 引用与解引用 https://blog.csdn.net/flyqwang/article/detail...

  • C语言数据结构-链表大解剖

    链表抽象结构解析 引用、解引用、指针、链表赋值取值 链表抽象结构解析 引用、解引用、指针、链表赋值取值

  • C++ 引用与解引用;指针、地址与对象

    自责中往往有种奢侈。我们自责时,往往觉得别人无权再责备我们。 ——王尔德 指针曾是横亘在我与程序设计...

  • Rust Deref与自动解引用

    Deref和DerefMut都是Rust中的trait,用来对指针类型进行转化,得到指针所指向的内容。比如从Box...

  • 引用与指针

    指针是一个实体,而引用仅是个别名; 引用使用时无需解引用(*),指针需要解引用; 引用只能在定义时被初始化一次,之...

  • content-box与border-box区别

    1.盒模型尺寸: content-box(默认样式) border-box 2.content-box与borde...

  • C++:迭代器的设计与实现

    迭代器:类似指针的对象,可以解引用、自增、比较(!=)等操作。 STL中,迭代器用来STL Algorithm与C...

  • 2022-04-08

    盒体碰撞 前缀 UBX + 与原box重中间名+后缀 异形碰撞 前缀 UCX + 与原box重中间名+后缀

  • Go 语言学习笔记-指针、切片与结构体

    指针 指针就是地址。指针变量就是存储地址的变量 指针使用 &p : 引用*p : 解引用、间接引用 栈帧 用来给函...

网友评论

      本文标题:Box与解引用

      本文链接:https://www.haomeiwen.com/subject/hrefwltx.html