C++:智能指针 [unique_ptr]

文章目录

  • 0x1 基本使用
  • 0x11 get() [ 参照auto_ptr ]
  • 0x12 release() [ 参照auto_ptr ]
  • 0x13 reset() [ 参照auto_ptr ]
  • 0x14 get_deleter() [ 新增 ]
  • 0x15 operator bool [ 新增 ]
  • 0x16 swap() [ 新增 ]
  • 0x2 make_unique函数 [unique_ptr在C++11引入,make_unique在C++14引入]
    • 0x21 创建动态分配的整数对象
    • 0x22 创建动态分配的自定义类型对象
    • 0x23 创建动态分配的数组对象
  • 0x3 解决auto_ptr的迷惑问题
    • 0x31 解决auto_ptr迷惑点1 [unique_ptr禁止拷贝构造]
    • 0x32 解决auto_ptr迷惑点2 [unique_ptr禁止拷贝赋值]
  • 0x4 解决auto_ptr的被放弃原因
    • 0x41 解决原因1(拷贝行为结果不可控)
    • 0x42 解决原因2 (不支持数组)
    • 0x43 解决原因3 (STL容器不兼容)
  • 0x5 unique_ptr 仅仅可以解决独占资源所有权,不能解决共享资源的所有权,所以引入shared_ptr

0x1 基本使用

0x11 get() [ 参照auto_ptr ]

0x12 release() [ 参照auto_ptr ]

0x13 reset() [ 参照auto_ptr ]

0x14 get_deleter() [ 新增 ]

0x15 operator bool [ 新增 ]

可以通过nullptr判断,auto_ptr部支持

unique_ptr<string> p1(new string("HelloWorld"));p1.release();
if (p1 == nullptr) {cout << "p1 is nullptr" << endl;
}

0x16 swap() [ 新增 ]

unique_ptr<string> p1(new string("HelloWorld"));
unique_ptr<string> p2(new string("VsCode"));cout << *p1 << endl;
cout << *p2 << endl;
swap(p1, p2);
cout << *p1 << endl;
cout << *p2 << endl;

0x2 make_unique函数 [unique_ptr在C++11引入,make_unique在C++14引入]

make_unique是C++14引入的一个函数模板,用于创建并返回一个指向动态分配对象的unique_ptr智能指针。
它是为了简化代码,避免手动使用new和delete,以及确保资源的正确释放而设计的。

0x21 创建动态分配的整数对象

std::unique_ptr ptr = std::make_unique(42);
std::cout << "Value: " << *ptr << std::endl;

0x22 创建动态分配的自定义类型对象

struct Point {int x;int y;Point(int x, int y) : x(x), y(y) {}
};int main() {std::unique_ptr<Point> ptr = std::make_unique<Point>(10, 20);std::cout << "Point: (" << ptr->x << ", " << ptr->y << ")" << std::endl;return 0;
}

0x23 创建动态分配的数组对象

std::size_t size = 5;
std::unique_ptr<int[]> ptr = std::make_unique<int[]>(size);// 赋值
for (std::size_t i = 0; i < size; ++i) {ptr[i] = i + 1;
}// 打印
for (std::size_t i = 0; i < size; ++i) {std::cout << ptr[i] << ends;
}

0x3 解决auto_ptr的迷惑问题

0x31 解决auto_ptr迷惑点1 [unique_ptr禁止拷贝构造]

unique_ptr<string> p1(new string("HelloWorld"));// unique_ptr禁止拷贝构造
// error: use of deleted function
unique_ptr<string> p2(p1);
// unique_ptr使用move显示剪切操作
unique_ptr<string> p2(move(p1));

0x32 解决auto_ptr迷惑点2 [unique_ptr禁止拷贝赋值]

unique_ptr<string> p1(new string("HelloWorld"));// unique_ptr禁止拷贝赋值
unique_ptr<string> p3;
// error: use of deleted function
p3 = p1;
// unique_ptr使用move显示剪切操作
p3 = move(p1);
// 被剪切后的p1,不能再次被使用

0x4 解决auto_ptr的被放弃原因

0x41 解决原因1(拷贝行为结果不可控)

unique_ptr<int> foo_test(unique_ptr<int> uptr)
{cout << *uptr << endl;*uptr = 100;cout << *uptr << endl;return uptr;
}{unique_ptr<int> p1 = unique_ptr<int>(new int(3));cout << *p1 << endl;// copy赋值后,p2会会被释放掉// 此处使用move操作p1 = foo_test(move(p1));cout << *p1 << endl;
}

0x42 解决原因2 (不支持数组)

参考 0x23 创建动态分配的数组对象

0x43 解决原因3 (STL容器不兼容)

vector<unique_ptr<int>> Ary;
unique_ptr<int> p(new int(3));
// Ary.push_back(p);
Ary.push_back(move(p));

0x5 unique_ptr 仅仅可以解决独占资源所有权,不能解决共享资源的所有权,所以引入shared_ptr

unique_ptr是一种独占所有权的智能指针,‌它拥有对象的唯一所有权,‌并且不能被复制。‌
这意味着在同一时间内只能有一个unique_ptr指向给定的资源。‌
当unique_ptr离开作用域时,‌它所管理的资源会被自动释放,‌这种设计保证了资源的唯一性和确定性释放。‌
由于unique_ptr只能由一个对象拥有所有权,‌因此其内存管理方式更加安全。‌

shared_ptr则允许多个智能指针共享同一个资源的所有权。‌它通过引用计数来追踪有多少个shared_ptr指向同一资源。‌
当最后一个指向该资源的shared_ptr销毁时,‌资源被释放。
这使得shared_ptr非常适合于复杂数据结构的共享和跨组件传递。‌
然而,‌使用shared_ptr时需要注意循环引用导致的内存泄漏问题,‌以及如何避免这些问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA笔记十四

十四、集合 1.集合概述 (1)集合是存储其它对象的特殊对象&#xff0c;可以将集合当作一个容器 (2)集合的相关接口和类位于java.util包中 (3)集合中的接口和类是一个整体、一个体系 2.集合接口 接口定义了一组抽象方法&#xff0c;实现该接口的类需要实现这些抽象方法&…

Docker核心技术:Docker原理之Cgroups

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker原理之Cgroups&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1a;…

C++初学者指南-5.标准库(第一部分)--标准库最小/最大算法

C初学者指南-5.标准库(第一部分)–标准库min/max算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库min/max算法minmaxminmaxclamp (C17)min_elementmax_elementminmax_element相关内容 C标准库算法是一块新领域&#xff1f;⇒简短介绍 min min(a, b) → a 如果 a < b则…

Linux_实现UDP网络通信

目录 1、实现服务器的逻辑 1.1 socket 1.2 bind 1.3 recvfrom 1.4 sendto 1.5 服务器代码 2、实现客户端的逻辑 2.1 客户端代码 3、实现通信 结语 前言&#xff1a; 在Linux下&#xff0c;实现传输层协议为UDP的套接字进行网络通信&#xff0c;网络层协议为IPv4&am…

基于Fabric 的区块链测试方法调研与总结

Fabric概述 从应用层视角来看&#xff0c;Hyperledger Fabric为开发人员提供了CLI命令行终端、事件模块、客户端SDK、链码API等接口&#xff0c;为上层应用提供了身份管理、账本管理、交易管理、智能合约管理等区块链服务&#xff0c;具体如下&#xff1a; 身份管理&#xff…

百年传承,味在蒸面

2024年7月15日&#xff0c;西安工程大学赴陕西安康“筑梦乡村&#xff0c;携手同行”暑期社会实践团队前往陕西安康鼓楼西街对非遗美食马国庆蒸面进行实践活动。 早晨七点&#xff0c;实践团队在鼓楼西街路口整装集合前往马国庆蒸面&#xff0c;据实践团队前期资料收集了解到马…

k8s+containerd(kvm版)

k8s&#xff08;Kubernetes&#xff09;是由Gogle开源的容器编排引擎&#xff0c;可以用来管理容器化的应用程序和服务&#xff0c;k 高可用&#xff1a;系统在长时间内持续正常地运行&#xff0c;并不会因为某一个组件或者服务的故障而导致整个系统不可用可扩展性&#xff1a…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示&#xff0c;显然这不安全&#xff0c;有的程序员离职了以后可能会做一些非法骚操作&#xff0c;所以我们最好要做一个加密&#xff0c;只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…

爬虫学习3:爬虫的深度爬取

爬虫的深度爬取和爬取视频的方式 深度爬取豆瓣读书 import time import fake_useragent import requests from lxml import etree head {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 …

陶德:边种田边写代码,3年300万行,一个人写出了“国产大满贯QT”

这是《开发者说》的第12期&#xff0c;本期我们邀请的开发者是陶德&#xff0c;从小在国企矿山里长大&#xff0c;计算机成绩是文科班里最差的一个&#xff0c;毕业两年找不到工作&#xff0c;睡过公园&#xff0c;讨过剩饭&#xff0c;用打魔兽世界的方式磨炼技术&#xff0c;…

.NET 8+Vue2 部署到Window Server

.NET 8Vue2 部署到Window Server 1 配置环境 1.1 下载安装.NET 8 SDK&#xff0c;下载时需注意目标服务器的系统类型&#xff08;64位 or 32位&#xff09; https://dotnet.microsoft.com/zh-cn/download 1.2 下载安装SQL Server数据库&#xff08;服务和管理工具&#xff…

LeetCode 129, 133, 136

文章目录 129. 求根节点到叶节点数字之和题目链接标签思路代码 133. 克隆图题目链接标签思路代码 136. 只出现一次的数字题目链接标签思路代码 129. 求根节点到叶节点数字之和 题目链接 129. 求根节点到叶节点数字之和 标签 树 深度优先搜索 二叉树 思路 由于本题需要 从…

海外短剧系统搭建开发定制,H5/APP源码搭建部署,支持二开

目录 前言&#xff1a; 一、系统功能 二、部署流程 前言&#xff1a; 海外短剧系统搭建部署&#xff0c;前端uniapp&#xff0c;PHP语言。支持二开功能。 一、系统功能 以下是改写后的内容&#xff1a; 1. 多语言环境集成 —— 提供一键式翻译功能&#xff0c;轻松切换多…

【Vue3】计算属性

【Vue3】计算属性 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…

IT common sense常识

how to input formative json data in console console.log({"message": [{"cat_id": 1,"cat_name": "大家电","cat_pid": 0,"cat_level": 0,"cat_deleted": false,,,,})2) how to clear unecessary c…

基于生物地理算法的MLP多层感知机优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 生物地理算法&#xff08;BBO&#xff09;原理 4.2 多层感知机&#xff08;MLP&#xff09; 4.3 BBO优化MLP参数 5.完整程序 1.程序功能描述 基于生物地理算法的MLP多层感知机优化mat…

【数学建模】——前沿图与网络模型:新时代算法解析与应用

目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…

C语言——字符串拼接strcat及自实现代码

strcat函数 在C语言中&#xff0c;strcat函数用于将两个字符串连接起来&#xff0c;即将源字符串&#xff08;source string&#xff09;追加到目标字符串&#xff08;destination string&#xff09;的末尾&#xff0c;并返回目标字符串。这个函数定义在头文件<string.h&g…

[Linux]Mysql之主从同步

AB复制 一、主从复制概述 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff1b;主数据库一般是准实时的业务数据库。 主从复制的作用 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xf…