RUST 每日一省:智能指针

        智能指针是一些数据结构,它们的行为类似于指针但拥有额外的元数据和附加功能,这些功能会在创建和销毁指针时被调用和执行。例如Rc<T>智能指针,这种指针会通过记录所有者的数量来使一份数据被多个所有者同时持有,并在没有任何所有者时自动清理数据。并且大多数智能指针本身就拥有它们指向数据的所有权。

        智能指针区别于常规结构体的特性在于, 它实现了Deref和Drop 这两个trait。Deref trait使得智能指针结构体的实例拥有与引用一致的行为。Drop trait则使你可以自定义智能指针离开作用域时运行的代码,最重要的作用自动释放底层资源。 开发者也可以编写自己的智能指针

Drop
        Drop trait可以自动释放相关值超出作用域后占用的资源, 比如释放堆内存。 更重要的是, 除了释放内存, Drop还可以做很多其他的工作, 比如释放文件和网络连接。 Drop trait类似于其他语言中被称为析构函数的东西。它包含一个 drop 方法,当对象超出作用域时就会被调用。该方法将&mut self 作为参数。使用 drop 释放值是以LIFO 的方式进行的。也就是说,无论最后构建的是什么,都首先会被销毁。

pub trait Drop {
fn drop(&mut self);
}

Deref 和 DerefMut

        用Deref 可以重载解引用运算符*。 智能指针结构体中实现了Deref, 重载了解引用运算符的行为。这允许用户可以对智能指针直接使用解引用运算符*。虽然Deref 只为你提供了只读权限,但是还有 DerefMut,它可以为你提供对底层类型的可变引用。

pub trait Deref {
    type Target: ?Sized;
    fn deref(&self) -> &Self::Target;
}

智能指针的种类

  •  Box<T>:它提供了最简单的堆资源分配方式。 Box 类型拥有其中的值,并且可用于保存结构体中的值,或者从函数返回它们。
  • Rc<T>:它用于引用计数。每当获取新引用时,计数器会执行递增操作,并在用户释放引用时对计数器执行递减操作。当计数器的值为零时,该值将被移除。
  • Arc<T>:它用于原子引用计数。这与之前的类型类似,但具有原子性以保证多线程的安全性。
  • Cell<T>:它为我们提供实现了 Copy 特征的类型的内部可变性。换句话说,我们有可能获得多个可变引用。
  •  RefCell<T>:它为我们提供了类型的内部可变性,并且不需要实现 Copy 特征。它用于运行时的锁定以确保安全性。
  • Vec<T>: 指向一组同类型的顺序排列的堆上分配的对象, 且携带有当前缓存空间总大小和元素个数大小的元数据。
  • String:指向的是一个堆上分配的字节数组, 其中保存的内容是合法的utf8字符序列。 且携带有当前缓存空间总大小和字符串实际长度的元数据。
     

猜你喜欢

转载自blog.csdn.net/xq723310/article/details/130238294