智能指针使用

最近在复习C++的一些相关知识,正好把智能指针重新梳理一遍。


智能指针

作用

为什么需要智能指针?说白了就是为了更加“方便智能”的管理内存,当使用原始指针有时候会因为忘记释放内存,从而导致内存泄漏
。智能指针则可以帮我们释放new出来的内存。

1.auto_ptr

	auto_ptr 是通过由 new 表达式获得的对象,并在 auto_ptr 自身被销毁时删除该对象的智能指针。
它可用于为动态分配的对象提供异常安全、传递动态分配对象的所有权给函数和从函数返回动态分配的对象。复制 auto_ptr ,会复制指针并转移所有权给目标: auto_ptr 的复制构造和复制赋值都会修改其右侧参数,
而且“副本”不等于原值。因为这些不常见的复制语义,不可将 auto_ptr 置于标准容器中。
此用途及其他使用更适合用 std::unique_ptr 。 (C++11 起)

示例

#include <iostream>
#include <memory>
using namespace std;class Test {int a;
public:Test() : a(0) {cout << "a = 0" << endl;}//explicit Test(int i) : a(i) {cout << "int";}Test(int i) : a(i) {cout << "a:"<< a << endl;}Test(short s) : a(s) {cout << "short";}Test &operator=(int n) {a = n; cout << "operator=";}~Test(){cout << "析构" << endl;}
};int main() {auto_ptr<Test> t(new Test(5));auto_ptr<Test> t1(new Test);//auto_ptr<int []> t2(new int[5]);  //不支持(2)unique_ptr<int []> t3(new int[5]);cout << t.get() << endl;cout << t1.get() << endl;t = t1;			//(1) ,建议不要这样使用cout << t.get() << endl;cout << t1.get() << endl;    return 0;
}
现在一般不使用auto_ptr<>,主要其存在诸多弊端:
1.复制或者赋值都会改变资源的所有权 ,见代码(1)
2.在STL容器中使用auto_ptr存在着重大风险,因为容器内的元素必须支持可复制和可赋值,原因可参考(1)
3.不支持对象数据内存管理,见(2)

所以,C++11用更严谨的unique_ptr 取代了auto_ptr。

unique_ptr

1.基于排他所有权模式:两个指针不能指向同一个资源
2.无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值
3.保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。
4.在容器中保存指针是安全的
    unique_ptr<Test> t(new Test(5));unique_ptr<Test> t1(new Test);cout << "---------------" << endl;//t = t1;   //不支持,两个指针不能指向同一资源//unique_ptr<Test> t2(t1);//不支持,可以理解为不能指向同一资源unique_ptr<Test> t3(move(t1));//允许,移动了所有权,将t1的所有权给了t3

shared_ptr

std::shared_ptr 是通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可占有同一对象。
下列情况之一出现时销毁对象并解分配其内存:
1.最后剩下的占有对象的 shared_ptr 被销毁;
2.最后剩下的占有对象的 shared_ptr 被通过 operator= 或 reset() 赋值为另一指针。
这就是共享模式,他很好的解决了unique_ptr<>的缺点,使得多个指针能够指向同一个资源。
    shared_ptr<Test> t(new Test(5));shared_ptr<Test> t1(new Test());cout << t.use_count() << endl;	//引用计数cout << t.unique() << endl;//判断当前是否仅有一个指针进行管理cout << t1.use_count() << endl;t1 = t;cout << "t1 = t" << endl;cout << t1.use_count() << endl;	// t1 和 t两个指针进行管理cout << t.use_count() << endl;cout << t.unique() << endl;cout << "-------------------" << endl;

智能指针常用方法

1.reset
替换所管理的对象
(公开成员函数)

2.swap
交换所管理的对象
(公开成员函数)

3.get
返回存储的指针
(公开成员函数)

4.use_count
返回 shared_ptr 所指对象的引用计数
(公开成员函数)

5.unique
(C++20 前)
检查所管理对象是否仅由当前 shared_ptr 的实例管理

4和5为共享指针所有

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

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

相关文章

如何在PHP中使用字符串

引言 字符串是由一个或多个字符组成的序列&#xff0c;可以由字母、数字或符号组成。所有的书面通信都是由字符串组成的。因此&#xff0c;它们是任何编程语言的基础。 在本文中&#xff0c;您将学习如何创建和查看字符串的输出&#xff0c;如何使用转义序列&#xff0c;如何连…

学历提升的途径,到底有哪些?5步带你搞清楚!

提升学历的方式有哪些&#xff1f; 目前提升有四种形式&#xff0c;分别是统招全日制、自学考试、成人高考、国家开放大学。 它们都是国家承认的学历&#xff0c;学信网可查&#xff0c;可以考公务员、研究生。 统招全日制含金量最高。 之前有一种形式是网络教育&#xff0…

Azure不可变Blob存储

文章目录 Azure不可变Blob存储介绍Azure不可变性策略实战演练 Azure不可变Blob存储介绍 不可变的存储是一种用于存储业务关键型 Blob 数据的存储方式。与可变存储相反&#xff0c;不可变存储的特点是一旦数据被写入后&#xff0c;便无法再对其进行修改或删除。这种存储方式提供…

【leetcode 力扣刷题】交换链表中的节点

24. 两两交换链表中的节点 24. 两两交换链表中的节点两两节点分组&#xff0c;反转两个节点连接递归求解 24. 两两交换链表中的节点 题目链接&#xff1a;24. 两两交换链表中的节点 题目内容&#xff1a; 题目中强调不能修改节点内部值&#xff0c;是因为如果不加这个限制的话…

实验室信息化管理系统的优势及发展趋势

随着现代化实验室的快速发展&#xff0c;实验室数据的管理和处理已经不再是单纯的人工填写、计算和报表编制&#xff0c;实验室管理工作的复杂性和艰巨性与日俱增&#xff0c;传统实验室的管理模式已经无法满足实验室管理的需求。为了解决这些问题&#xff0c;LIMS&#xff08;…

Windows下编译NextCloud desktop 3.9.1

首先从官方下载源码&#xff1a; https://github.com/nextcloud/desktop&#x1f4bb; Desktop sync client for Nextcloud. Contribute to nextcloud/desktop development by creating an account on GitHub.https://github.com/nextcloud/desktop 我选择的是3.9.1的稳定版本…

Elasticsearch(十二)搜索---搜索匹配功能③--布尔查询及filter查询原理

一、前言 本节主要学习ES匹配查询中的布尔查询以及布尔查询中比较特殊的filter查询及其原理。 复合搜索&#xff0c;顾名思义是一种在一个搜索语句中包含一种或多种搜索子句的搜索。 布尔查询是常用的复合查询&#xff0c;它把多个子查询组合成一个布尔表达式&#xff0c;这些…

栈:后进先出的数据结构

栈与队列 在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它的特殊性在于遵循后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的原则。栈被广泛应用于各种计算机算法和程序设计中&#xff0c;它的简单而有效…

Spring 为什么使用三级缓存解决循环依赖

文章目录 前言1. 什么是循环依赖1.1 互相依赖1.2 递归依赖 2. Sping中循环依赖有什么问题&#xff1f;3. 什么是三级缓存4. Spring 可以解决哪些情况的循环依赖&#xff1f; 二级缓存作用——普通循环依赖实操环节1. 实例化类A对象2. 实例化类B对象3. B对象完成创建4.继续创建A…

数字图像处理—— Lab、YCbCr、HSV、RGB之间互转

Lab “Lab” 图像格式通常指的是 CIELAB 色彩空间&#xff0c;也称为 Lab 色彩空间。它是一种用于描述人类视觉感知的颜色的设备无关色彩空间&#xff0c;与常见的 RGB 和 CMYK 色彩空间不同。CIELAB 由国际照明委员会&#xff08;CIE&#xff09;于1976年定义&#xff0c;用于…

数据驱动工作效率提升的5个层次—以PreMaint设备数字化平台为例

在现代工业领域&#xff0c;数据分析已成为提升工作效率和优化生产的不可或缺的工具。从描述性分析到规范性分析&#xff0c;数据分析逐步揭示了设备运行和维护的深层信息&#xff0c;帮助企业更明智地做出决策。本文将以PreMaint设备数字化平台为例&#xff0c;探讨工业数据驱…

反转链表(C++)

1、迭代法的一种写法 ListNode* reverse_linkList(ListNode* head){if(head nullptr || head->next nullptr) return head;ListNode* begin nullptr;ListNode* mid head;ListNode* end head->next;while(true){mid->next begin;if(end nullptr){break;}begin …

MySQL常用表级操作

基础信息相关 1.修改表名&#xff1a; rename table 旧表名 to 新表名; 2、修改字段类型&#xff1a; alter table 表名 modify column 字段名 字段类型(长度) 3、修改字段名称和类型&#xff1a; alter table 表名 change 现有字段名称 修改后字段名称 数据类型 4、增加字段&a…

《存储IO路径》专题:DDIO对系统性能的影响

DDIO对系统性的影响 想象一下,有一天,你在网上冲浪,突然,一个巨大的数据包从天而降,直接砸在了你的电脑上。你一看,哇,是全新的《英雄联盟》版本!你迫不及待地打开了游戏,发现加载速度简直快如闪电。 那么,这个神奇的事情是怎么发生的呢? 其实,这都要归功于DDIO技…

Wireshark数据抓包分析之ARP协议

一、实验目的&#xff1a; 通过wireshark的数据抓包了解这个ARP协议的具体内容 二、预备知识: 1.Address Resolution Protocol协议&#xff0c;就是通过目标IP的值&#xff0c;获取到目标的mac地址的一个协议 2.ARP协议的详细工作过程&#xff0c;下面描述得非常清晰&#xff…

230814期优橙5G网络优化就业班开班啦!这样的学习环境泰酷辣!~

230814期为期8天的基础班顺利结束&#xff01; 接下来就是为期3个月的就业班 小优橙一点都不敢耽搁时间 紧跟优橙老师教学节奏 今日通知 230814期优橙就业班今天已经正式开班&#xff01; 本次就业班有哪些新收获&#xff01; 快来跟着学员视角看看8天在优橙真实感受吧~…

四旋翼欧拉方程推导过程

四旋翼欧拉方程推导过程 目录 一、欧拉方程的推导过程二、向量叉乘和叉乘1、向量点乘(内积)2、向量叉乘(外积)3三、矩阵乘法1、矩阵点乘3、矩阵乘法一、欧拉方程的推导过程 (参考:https://www.zhihu.com/question/327324524) 根据定义,角动量的表达式为: H = I ⋅ …

【方案】安防监控EasyCVR智慧工地视频监管风险预警平台的应用

智慧工地方案是一种结合现代化技术与工地管理实践的创新型解决方案。它通过实时监控、数据分析、人工智能等技术手段&#xff0c;使工地管理更加高效、智能化。在建设智慧工地的过程中&#xff0c;除了上述提到的利用物联网技术实现设备互联、数据采集及分析以外&#xff0c;还…

C++学习笔记总结练习:nullptr、NULL、0

三者的区别 参考文献 区别 1 说明 C中的NULL C中使用 ((void*)0)表示空指针。NULL会被替换为 ((void*)0) int *i NULL; foo_t *f NULL;#define NULL ((void*)0)C中的NULL C中void* 不能进行强制类型转换成其他类型的NULL&#xff0c;所以int* 类型的空指针&#xff0c;不…

vue使用插件vue-seamless-scroll无限滚动列表

链接: vue-seamless-scroll插件文档 安装vue-seamless-scroll npm install vue-seamless-scroll --save引入 1、main.js全局引入 import scroll from vue-seamless-scroll Vue.use(scroll)2、局部引入 import vueSeamlessScroll from vue-seamless-scrollcomponents: {vueS…