45_智能指针

1. 概述

指针:一个变量在内存中包含的是一个地址(指向其他数据),该变量就是一个指针。

在Rust中最常见的指针就是"引用"。

引用:

  • 使用&标注
  • 借用它指向的值
  • 而且没有其余的开销
  • 最常见的指针类型

智能指针是这样的一些数据结构:

  • 行为和指针相似
  • 有额外的元数据和功能

2. 引用计数(reference counting)智能指针类型

引用计数智能指针是通过记录所有者的数量,使一份数据被多个所有者同时持有,并在没有任何所有者时自动清理数据。

通过这个概念我们得知引用和智能指针有所不同:

  • 引用:是借用数据
  • 智能指针:很多时候都拥有它所指向的数据。

以下是智能指针的例子

  • String
  • Vec<T>

特点:

  • 它们都拥有一片内存区域,并且允许用户对其操作
  • 而且它们还有元数据,例如容量等
  • 提供额外的功能或保障,如String保障其数据都是合法的UTF8编码

3. 智能指针的实现

智能指针通常使用struct实现,和一般结构体不同的是,智能指针的结构体通常会实现DerefDrop这两个Trait。

  • Deref trait:允许智能指针struct的实例像引用一样使用
  • Drop trait:允许你自定义当智能指针实例离开作用域时运行的代码

4. 智能智能的内容

在下面几节中,将介绍标准库中常见的智能指针

  • Box<T>:在heap内存上分配
  • Rc<T>:启用多重所有权的引用计数类型
  • Ref<T>RefMut<T>,通过RefCell<T>访问:在运行时而不是编译时强制借用规则的类型

此外还将介绍以下两个知识点

  • 内部可变模式(interior mutability pattern):不可变类型暴露出可修改其内部值的API
  • 循环引用(reference cycles):它们如何泄露内存,以及如何防止其发生
相关推荐
阿星做前端8 小时前
不想再给ai回复下一步了,于是我给agent装上了一个自动挡
前端·后端·程序员
毛骗导演8 小时前
Skill 还是 Tool?——从 OpenClaw 源码看 Agent 能力扩展的两种范式
前端·架构
周杰伦fans8 小时前
禁止edge浏览器更新
前端·edge
alwaysrun8 小时前
Rust之所有权与借用详解
程序员·rust·编程语言
user297525876128 小时前
使用SSE实现流式渲染实践
前端·javascript
LPieces8 小时前
【LPieces-UI】02-Icon组件的设计与实现
前端·vue.js
我本地是好的8 小时前
解决高德地图无外网访问难题:Vue项目代理转发全攻略
前端
wand codemonkey8 小时前
Maven Web 项目 + Tomcat 从零排错全流程(零遗漏版)
前端·tomcat·maven
豆苗学前端8 小时前
【前端内功】同为数据驱动,为什么只有 React 的"心智负担"这么重?(附实战优化指南)
前端·vue.js·面试
铁皮饭盒8 小时前
震惊, Bun突发新版, 重写核心, 换掉了底层Zig
前端·javascript·后端