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):它们如何泄露内存,以及如何防止其发生
相关推荐
doiito(Do It Together)3 分钟前
【安全,架构】RustyVault 项目深度分析报告以及和HashiCorp Vault的差异
微服务·架构·rust
我有满天星辰13 分钟前
Vue 指令完全指南:从 Vue 2 到 Vue 3 的演进与实战
前端·javascript·vue.js
问窗14 分钟前
Rust实现Windows本地搜索工具
windows·搜索引擎·rust
光影少年15 分钟前
RN 渲染原理:不依赖WebView,原生控件渲染
前端·react native·react.js·前端框架
小白学过的代码16 分钟前
# flv.js / mpegts.js 播不了国标摄像头(H.265 + G.711A)?纯前端 Jessibuca 无后端方案(附完整代码)
前端·javascript·h.265
console.log('npc')20 分钟前
AI Agent 前端流式渲染核心技术文档(SSE \+ WebSocket \+ 打字机渲染)
前端·人工智能·websocket
法外狂徒130 分钟前
将 Pi Agent 接入 HagiCode 的实践之路
服务器·前端·人工智能
IT_陈寒37 分钟前
React中useEffect的依赖项把我坑惨了
前端·人工智能·后端
广州华水科技1 小时前
单北斗GNSS在变形监测中的优势与应用分析
前端
程序员爱钓鱼2 小时前
Rust 变量与不可变性:为什么默认不能修改变量?
前端·后端·rust