C++ 中的智能指针(Smart Pointer)

embedded/2024/11/14 4:08:20/

C++ 中的智能指针(Smart Pointer)是用于管理动态内存分配的工具,它们能够自动管理资源的生命周期,避免内存泄漏。智能指针是 C++11 标准引入的,通过模板类封装原生指针,实现资源的自动释放。主要的智能指针包括 std::shared_ptrstd::unique_ptr

1. std::unique_ptr

std::unique_ptr 是一种独占所有权的智能指针,表示某个资源只能被一个指针管理。它确保同一资源在程序中只会有一个指针指向,当 std::unique_ptr 被销毁时,资源会被自动释放。

特点
  • 独占所有权std::unique_ptr 禁止拷贝操作,确保唯一所有权。
  • 自动释放资源:当 std::unique_ptr 超出作用域时,资源自动释放。
  • 移动语义:可以通过 std::move 转移所有权,但不能复制。
常用操作
  • 创建和使用:使用 std::make_unique 创建 std::unique_ptr
  • 访问资源:通过 operator*operator-> 访问资源。
  • 释放资源:可以使用 reset 手动释放资源。
示例代码
#include <iostream>
#include <memory> // 包含 unique_ptr 所在的头文件int main() {// 创建 unique_ptr 并指向一个动态分配的 intstd::unique_ptr<int> ptr = std::make_unique<int>(10);// 访问指针的值std::cout << "Value: " << *ptr << std::endl;// 不能复制 unique_ptr// std::unique_ptr<int> ptr2 = ptr;  // 错误// 可以通过移动语义转移所有权std::unique_ptr<int> ptr2 = std::move(ptr);if (!ptr) {std::cout << "ptr is now nullptr after moving ownership." << std::endl;}return 0;
}

输出

Value: 10
ptr is now nullptr after moving ownership.

2. std::shared_ptr

std::shared_ptr 是一种共享所有权的智能指针,允许多个指针共享同一个资源。std::shared_ptr 内部维护一个引用计数,记录有多少个 shared_ptr 指向该资源。当最后一个 shared_ptr 被销毁时,资源会自动释放。

特点
  • 共享所有权:多个 shared_ptr 可以指向同一个资源。
  • 引用计数:每个 shared_ptr 维护资源的引用计数。
  • 自动释放资源:当引用计数为 0 时,资源自动释放。
常用操作
  • 创建和使用:使用 std::make_shared 创建 std::shared_ptr
  • 访问资源:通过 operator*operator-> 访问资源。
  • 引用计数:通过 use_count 查看当前的引用计数。
示例代码
#include <iostream>
#include <memory> // 包含 shared_ptr 所在的头文件int main() {// 创建 shared_ptr 并指向一个动态分配的 intstd::shared_ptr<int> ptr1 = std::make_shared<int>(20);// 打印引用计数std::cout << "Reference count: " << ptr1.use_count() << std::endl;{// 创建一个新的 shared_ptr,指向相同资源std::shared_ptr<int> ptr2 = ptr1;std::cout << "Reference count after creating ptr2: " << ptr1.use_count() << std::endl;}// ptr2 超出作用域,引用计数减少std::cout << "Reference count after ptr2 goes out of scope: " << ptr1.use_count() << std::endl;return 0;
}

输出:

Reference count: 1
Reference count after creating ptr2: 2
Reference count after ptr2 goes out of scope: 1

3. std::weak_ptr

std::weak_ptr 是一种非拥有型的智能指针,用于解决 shared_ptr 的循环引用问题。它不会增加资源的引用计数,仅持有资源的一个弱引用,无法直接访问资源,需通过 lock 方法获得一个 shared_ptr 来使用。

示例代码
#include <iostream>
#include <memory>int main() {std::shared_ptr<int> sp = std::make_shared<int>(30);std::weak_ptr<int> wp = sp; // 使用 weak_ptr 指向同一资源std::cout << "Reference count: " << sp.use_count() << std::endl;if (auto spt = wp.lock()) { // 通过 lock 创建一个 shared_ptrstd::cout << "Weak pointer is valid, value: " << *spt << std::endl;} else {std::cout << "Weak pointer is expired." << std::endl;}sp.reset(); // 释放 shared_ptr 所有权if (wp.expired()) {std::cout << "Weak pointer is now expired." << std::endl;}return 0;
}

输出:

Reference count: 1
Weak pointer is valid, value: 30
Weak pointer is now expired.

总结

智能指针特点使用场景
std::unique_ptr独占所有权,不允许复制;可以通过 std::move 转移所有权需要独占管理资源,避免拷贝操作
std::shared_ptr共享所有权,使用引用计数管理资源的生命周期多个对象共享资源,需自动释放资源
std::weak_ptr非拥有型指针,不影响引用计数,用于解决循环引用问题检查或跟踪资源是否仍然存在

std::unique_ptrstd::shared_ptr 提供了简单、灵活的资源管理方式,有效降低内存泄漏风险。而 std::weak_ptr 主要用于防止 shared_ptr 的循环引用。


http://www.ppmy.cn/embedded/136928.html

相关文章

97_api_intro_imagerecognition_pdf2word

通用 PDF OCR 到 Word API 数据接口 文件处理&#xff0c;OCR&#xff0c;PDF 高可用图像识别引擎&#xff0c;基于机器学习&#xff0c;超精准识别率。 1. 产品功能 通用识别接口&#xff1b;支持中英文等多语言字符混合识别&#xff1b;formdata 格式 PDF 文件流传参&#xf…

[极客大挑战 2019]HTTP 1

[极客大挑战 2019]HTTP 1 审题 看到题目页面发现没啥东西&#xff0c;直接看源码发现了&#xff0c;Secret.php 进入查看题目&#xff0c;发现又是一道跟着提示达到条件的题目 知识点 跟着题目走。 解题 题目说不是来自https://Sycsecret.buuoj.cn的访问&#xff0c;但是我…

深入了解区块链:Web3的基础架构与发展

在数字时代的浪潮中&#xff0c;区块链技术正逐渐成为Web3的重要基础&#xff0c;重新定义互联网的结构和用户体验。Web3不仅是一个全新的网络阶段&#xff0c;更代表了一种去中心化的理念&#xff0c;强调用户主权和数据隐私。本文将深入探讨区块链在Web3中的基础架构、技术特…

【Transformer】模型输出模块处理

目录 输出处理模块步骤1. 交叉注意力后的输出向量2. 线性变换&#xff08;投影&#xff09;3. Softmax 操作4. 选择最大概率的单词5. 输出词并进入下一轮预测总结&#xff1a; 线性变换详解1. 交叉注意力后的输出向量2. 线性层的参数3. 线性变换的计算4. Softmax 转换为概率示例…

Linux - 信号

文章目录 一、信号的定义二、查看信号三、产生信号1、指令2、系统调用3、由软件条件产生信号4、异常5、键盘输入 四、保存信号1、补充&#xff1a;信号其他相关概念2、信号保存在哪&#xff0c;怎么保存&#xff1f;3、信号集操作函数 五、捕获信号1、概念2、捕获信号的时机3、…

《Foundation 图标参考手册》

《Foundation 图标参考手册》 介绍 Foundation 图标参考手册是一个综合资源,旨在为设计师、开发人员和用户提供关于 Foundation 图标框架的详尽信息。Foundation 是一个流行的前端框架,以其响应式设计和易用性而闻名。本手册将深入探讨 Foundation 图标集,包括其特点、使用…

微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka

在 Windows 上安装 MySQL 下载 MySQL 安装包&#xff1a; 访问 MySQL 官方网站。选择适合 Windows 的安装程序&#xff0c;下载并保存。 运行安装程序&#xff1a; 双击下载的安装文件&#xff0c;开始安装。在安装向导中选择“开发者默认”或“完整安装”。 配置 MySQL&#x…

第二周训练

第二周 2-SAT&#xff1a; Problems - Virtual Judge //n^2建图&#xff08;枚举前后重叠&#xff09;&#xff0c;跑tarjian&#xff1b; [HNOI2010] 平面图判定 - 洛谷 //判断相交条件 if(x1>y1)swap(x1,y1);if(x2>y2)swap(x2,y2);if(x1>x2)swap(x1,x2),swap(y1,…