当前位置: 首页 > news >正文

memory动态内存管理学习之unique_ptr

此头文件是动态内存管理库的一部分。std::unique_ptr 是一种智能指针,它通过指针持有并管理另一对象,并在 unique_ptr 离开作用域时释放该对象。在发生下列两者之一时,用关联的删除器释放对象:

  • 管理它的 unique_ptr 对象被销毁。
  • 通过 operator= 或 reset() 赋值另一指针给管理它的 unique_ptr 对象。

成员函数

(构造函数)

构造新的 unique_ptr
(公开成员函数)

(析构函数)

析构所管理的对象,如果存在的话
(公开成员函数)

operator=

unique_ptr 赋值
(公开成员函数)
修改器

release

返回一个指向被管理对象的指针,并释放所有权
(公开成员函数)

reset

替换被管理对象
(公开成员函数)

swap

交换被管理对象
(公开成员函数)
观察器

get

返回指向被管理对象的指针
(公开成员函数)

get_deleter

返回用于析构被管理对象的删除器
(公开成员函数)

operator bool

检查是否有关联的被管理对象
(公开成员函数)
单对象版本,unique_ptr<T>

operator*operator->

解引用指向被管理对象的指针
(公开成员函数)
数组版本,unique_ptr<T[]>

operator[]

提供到被管理数组的有索引访问
(公开成员函数)

代码示例:

#include <iostream>
#include <memory>// unique_ptr deleter with state
class state_deleter {int count_;
public:state_deleter():count_(0) {}template<class T>void operator()(T* p) {std::cout << "[deleted #" << ++count_ << "]\n";delete p;}
};struct C{int a;int b;
};int main()
{// unique_ptr constructor examplestd::default_delete<int> d;std::unique_ptr<int> u1;std::unique_ptr<int> u2(nullptr);std::unique_ptr<int> u3(new int);std::unique_ptr<int> u4(new int, d);std::unique_ptr<int> u5(new int, std::default_delete<int>());std::unique_ptr<int> u6(std::move(u5));std::unique_ptr<int> u7(std::move(u6));std::unique_ptr<int> u8(std::auto_ptr<int>(new int));std::cout << "u1: " << (u1 ? "not null" : "null") << '\n';std::cout << "u2: " << (u2 ? "not null" : "null") << '\n';std::cout << "u3: " << (u3 ? "not null" : "null") << '\n';std::cout << "u4: " << (u4 ? "not null" : "null") << '\n';std::cout << "u5: " << (u5 ? "not null" : "null") << '\n';std::cout << "u6: " << (u6 ? "not null" : "null") << '\n';std::cout << "u7: " << (u7 ? "not null" : "null") << '\n';std::cout << "u8: " << (u8 ? "not null" : "null") << '\n';// unique_ptr destructor exampleauto deleter = [](int *p) {delete p;std::cout << "deleter called\n";};std::unique_ptr<int, decltype(deleter)> foo(new int, deleter);std::cout << "foo " << (foo ? "is not" : "is") << " empty\n";// unique_ptr::operator= examplestd::unique_ptr<int> foo2;std::unique_ptr<int> bar2{ nullptr };foo2 = std::unique_ptr<int>(new int(101));  // rvaluebar2 = std::move(foo2);                       // using std::movestd::cout << "foo2: ";if (foo2)std::cout << *foo2 << '\n';elsestd::cout << "empty\n";std::cout << "bar2: ";if (bar2)std::cout << *bar2 << '\n';elsestd::cout << "empty\n";// unique_ptr::get vs unique_ptr::release//foo3	bar3	p3std::unique_ptr<int> foo3;				//nullstd::unique_ptr<int> bar3;				//null	nullint *p3 = nullptr;						//null	null	nullstd::cout << "foo3: ";if(foo3) std::cout << *foo3 << '\n';else std::cout << "(null)\n";std::cout << "bar3: ";if(bar3) std::cout << *bar3 << '\n';else std::cout << "(null)\n";std::cout << "p3: ";if(p3) std::cout << *p3 << '\n';else std::cout << "(null)\n";std::cout << '\n';foo3 = std::unique_ptr<int>(new int(10));	//(10)	null	nullbar3 = std::move(foo3);						//null  (10)	nullp3 = bar3.get();							//null	(10)	(10)*p3 = 20;									//null	(20)	(20)p3 = nullptr;								//null	(20)	nullstd::cout << "foo3: ";if (foo3) std::cout << *foo3 << '\n';else std::cout << "(null)\n";std::cout << "bar3: ";if (bar3) std::cout << *bar3 << '\n';else std::cout << "(null)\n";std::cout << "p3: ";if (p3) std::cout << *p3 << '\n';else std::cout << "(null)\n";std::cout << '\n';foo3 = std::unique_ptr<int>(new int(30));	//(30)	(20)	nullp3 = foo3.release();						//null	(20)	(30)*p3 = 40;									//null	(20)	(40)std::cout << "foo3: ";if (foo3) std::cout << *foo3 << '\n';else std::cout << "(null)\n";std::cout << "bar3: ";if (bar3) std::cout << *bar3 << '\n';else std::cout << "(null)\n";std::cout << "p3: ";if (p3) std::cout << *p3 << '\n';else std::cout << "(null)\n";std::cout << '\n';delete p3;   // unique_ptr::get_deleter examplestate_deleter del;std::unique_ptr<int> p; //使用默认的deleter;// alpha and beta use independent copies of the deleter:std::unique_ptr<int, state_deleter> alpha(new int);std::unique_ptr<int, state_deleter> beta(new int, alpha.get_deleter());// gamma and delta share the deleter "del" (deleter type is a reference!):std::unique_ptr<int, state_deleter&> gamma(new int, del);std::unique_ptr<int, state_deleter&> delta(new int, gamma.get_deleter());std::cout << "resetting alpha...";	alpha.reset(new int);std::cout << "resetting beta...";	beta.reset(new int);std::cout << "resetting gamma...";	gamma.reset(new int);std::cout << "resetting delta...";	delta.reset(new int);std::cout << "calling gamma/delta deleter...\n";gamma.get_deleter() = state_deleter();//新的deleter// additional deletions when unique_ptr objects reach out of scope (in inverse order of declaration)// example of unique_ptr::operator boolstd::unique_ptr<int> foo4;std::unique_ptr<int> bar4(new int(12));if(foo4) std::cout << "foo4 points to " << *foo4 << '\n';else std::cout << "foo4 is empty\n";if(bar4) std::cout << "bar4 points to " << *bar4 << '\n';else std::cout << "bar4 is empty\n";// unique_ptr::swap examplestd::unique_ptr<int> foo5(new int(10));std::unique_ptr<int> bar5(new int(20));std::cout << "foo5:" << *foo5 << '\n';std::cout << "bar5:" << *bar5 << '\n';foo5.swap(bar5);std::cout << "foo5:" << *foo5 << '\n';std::cout << "bar5:" << *bar5 << '\n';// unique_ptr::operator*std::unique_ptr<int> foo6(new int);std::unique_ptr<int> bar6(new int(100));std::cout << "foo6: " << *foo6 << '\n';std::cout << "bar6: " << *bar6 << '\n';*foo6 = *bar6 * 2;std::cout << "foo6: " << *foo6 << '\n';std::cout << "bar6: " << *bar6 << '\n';// unique_ptr::operator->std::unique_ptr<C> foo7(new C);std::unique_ptr<C> bar7;foo7->a = 10;foo7->b = 20;bar7 = std::move(foo7);if (foo7) std::cout << "foo7: " << foo7->a << ' ' << foo7->b << '\n';if (bar7) std::cout << "bar7: " << bar7->a << ' ' << bar7->b << '\n';// unique_ptr::operator[]std::unique_ptr<int[]> foo8(new int[5]);for (int i = 0; i < 5; ++i) foo8[i] = i;for (int i = 0; i < 5; ++i)std::cout << foo8[i] << ' ';std::cout << '\n';return 0;
}

运行效果:

参考:

https://cplusplus.com/reference/memory/

https://zh.cppreference.com/w/cpp/header/memory

相关文章:

memory动态内存管理学习之unique_ptr

此头文件是动态内存管理库的一部分。std::unique_ptr 是一种智能指针&#xff0c;它通过指针持有并管理另一对象&#xff0c;并在 unique_ptr 离开作用域时释放该对象。在发生下列两者之一时&#xff0c;用关联的删除器释放对象&#xff1a; 管理它的 unique_ptr 对象被销毁。…...

1、项目介绍:为什么要做此项目。

项目介绍&#xff1a;为什么要做此项目。 全栈开发博客实战项目&#xff1a;前后端开发流程以及项目部署 随着互联网的蓬勃发展&#xff0c;全栈开发成为了越来越受欢迎的趋势。前端开发和后端开发之间的紧密合作和协同工作已经成为了现代软件开发中的重要组成部分。然而&…...

2024年6月7日第十五周下午学习英语六级大纲

下午学习英语六级大纲的内容可以归纳为以下几个主要方面&#xff1a; 一、考试概述 六级考试的对象&#xff1a;修完大学英语相应阶段课程的在校大学生。考试目的&#xff1a;参照《大学英语教学指南》设定的教学目标&#xff0c;对我国大学生英语综合运用能力进行科学测量&a…...

每日5题Day19 - LeetCode 91 - 95

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;91. 解码方法 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int numDecodings(String s) {int n s.length();//注意我们dp的范围是n1int[] d…...

wordpress里面嵌入哔哩哔哩视频的方法

我们正常如果从blibli获取视频分享链接然后在wordpress里面视频URL插入&#xff0c;发现是播放不了的 而视频嵌入代码直接粘贴呢窗口又非常的小 非常的难受&#xff0c;就需要更改一下代码。你可以在在allowfullscreen"true"的后面&#xff0c;留1个空格&#xff…...

Linux系统管理磁盘管理004

本章主要讲述详细lvm扩容。 操作系统&#xff1a; CentOS Stream 9 扩容目标&#xff1a; jianglv扩容到600MB 扩容前 [rootlocalhost ~]# lvdisplay lgb--- Logical volume ---LV Path /dev/lgb/nginx_lvmLV Name nginx_lvmVG Name …...

Flink窗口理论到实践

Flink窗口理论到实践可以分为以下几个关键部分进行阐述: 一、理论概述 窗口概念: Flink窗口是将无限流数据流切分为有限的、连续的数据块进行处理的一种机制。这有助于更高效、更方便地处理无界数据流。窗口分类: 时间窗口:基于固定时间段内收集数据,并在结束时生成结果。…...

279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计

基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计。计算出满足功率因素、电压不平衡度等电能指标的条件下。RPC所需要的补偿功率。求得所需最小的系统客量。该设计能快速计算出符合系统设定指标的各项最优补偿功率。并通过sumulink份真。检验设计参数的准确性。…...

46-3 护网溯源 - 溯源报告编写

格式 1. 基本情况︰钓鱼邮件情况介绍 在这部分,需要详细描述钓鱼邮件的基本情况,包括收到的邮件内容、寄件人信息、邮件附件或链接等。还需说明收到邮件的时间和频率。2. 行为分析 详细阐述攻击者的行为模式和攻击方式,包括攻击手段、使用的恶意工具或技术,以及可能的入侵…...

微服务之基本介绍

一、微服务架构介绍 1、微服务架构演变过程 单体应用架构->垂直应用架构一>分布式架构一>SOA架构-->微服务架构 ① 单体应用架构 互联网早期&#xff0c; 一般的网站应用流量较小&#xff0c;只需一个应用&#xff0c;将所有功能代码都部署在一起就可以&#x…...

嘉立创面板制作不规则图案技巧

首先附上效果图展示&#xff1a; 所需软件&#xff1a;嘉立创EDA(专业版)、photoshop、Adobe Illustrator 嘉立创EDA(专业版)&#xff1a; 嘉立创面板绘制很容易上手&#xff0c;只要了解这几个图层的作用便可以做出自己想要的面板。 材料边界层&#xff1a; 代表选⽤的材料…...

如何使用Python中的collections模块提供的数据结构,如deque、Counter、OrderedDict等

Python 的 collections 模块提供了一些额外的数据结构&#xff0c;这些数据结构在内置的数据类型&#xff08;如列表、字典、集合等&#xff09;的基础上&#xff0c;增加了额外的功能或优化了性能。下面是如何使用 collections 模块中的 deque、Counter 和 OrderedDict 这三种…...

2024年道路安全员考试题库

2024年道路安全员考试题库 16.根据《中华人民共和国道路运输条例》,关于从事客运经营使用的车辆的规定,下列说法错误的是(  )。 A.客运经营者应当使用符合国家规定标准的车辆从事道路运输经营 B.客运经营者应当加强对车辆的维护和检测,确保车辆符合国家规定的技术标准 C.…...

自建 Docker 镜像

本文地址&#xff1a;blog.lucien.ink/archives/547 本文主要参考自&#xff1a;自建Docker 镜像/源加速的方法 1. 简介 最近 Docker Hub 被禁一事引起了不小的波动&#xff0c;在这里简单讲下在这之后应该如何访问公开的 Docker Hub。 2. Cloudflare 2.1 搭建 搭建的前提是…...

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口&#xff0c;然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …...

代码审计(1):CVE-2022-4957分析及复现

0x00漏洞描述&#xff1a; ѕрееdtеѕt iѕ а vеrу liɡhtԝеiɡ&#xff48;t nеtԝоrk ѕрееd tеѕtinɡ tооl imрlеmеntеd in Jаvаѕсriрt. Thеrе iѕ а Crоѕѕ-ѕitе Sсriрtinɡ vulnеrаbilitу in librеѕроndеd ѕрееdtеѕt…...

问题:设备管理指标为完好率不低于( ),待修率不高于5%,事故率不高于1%。 #知识分享#经验分享#经验分享

问题&#xff1a;设备管理指标为完好率不低于( )&#xff0c;待修率不高于5%&#xff0c;事故率不高于1%。 A、100% B、95% C、90% D、80% 参考答案如图所示...

【Linux】(六)—— vim编辑器

vim文件编辑器 Vim&#xff08;Vi Improved&#xff09;是一个高度可配置的文本编辑器&#xff0c;最初基于UNIX下的Vi编辑器发展而来&#xff0c;广泛用于程序开发和系统管理中。vim编辑器可以只通过终端命令即可编写修改文件&#xff0c;不需要和gedit一样需要打开类似于记事…...

06016传感器原理与应用202207

06016传感器原理与应用202207 选择题&#xff08;2*11&#xff09; 1.基本的电子测量系统由四部分组成&#xff0c;即电源、信号调节、显示系统和B&#xff08;P7&#xff09; A.分档器 B.传感器 C.处理器 D.采集器 2.热电阻温度计的测量电路采用精度较高的是B&am…...

java web:springboot mysql开发的一套家政预约上门服务系统源码:家政上门服务系统的运行流程

java web&#xff1a;springboot mysql开发的一套家政预约上门服务系统源码&#xff1a;家政上门服务系统的运行流程 家政上门服务系统的优势 服务质量更稳定&#xff1a;由专业的家政人员提供服务&#xff0c;经过严格的培训和筛选。 价格更透明&#xff1a;采用套餐式收费&…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...