C++:智能指针 [auto_ptr]

文章目录

  • 0x1 基本使用
    • 0x11 初步使用
    • 0x12 get()函数【获取指针指向的内存地址】
    • 0x13 release()函数 【仅仅是释放所有权,但是并没有清空内存】
    • 0x14 reset()函数 【旧值析构,重新设置指针】
  • 0x2 迷惑点
    • 0x21 迷惑点1 (拷贝赋值)
    • 0x22 迷惑点2 (拷贝构造)
  • 0x3 C++放弃 auto_ptr 的原因
    • 0x31 原因1(拷贝行为结果不可控)
    • 0x32 原因2 (不支持数组)
    • 0x33 原因3 (STL容器不兼容)
  • 0x4 为了解决auto_ptr问题,引入unique_ptr

auto_ptr是最早的智能指针,在c++98引入,c++11停用,c++14废弃,C++17正式移除
本文在实践的角度上解释来龙去脉

0x1 基本使用

0x11 初步使用

// 方法1
{int *p = new int(4);auto_ptr<int> aptr0(p);auto_ptr<int> aptr1(p); 		// run error cout << *aptr0 << endl;       	// 使用指针指向的内容
}// 方法2:
{auto_ptr<int> aptr9(new int(3));cout << *aptr9 << endl;       	// 使用指针指向的内容
}

方法1,看似使用起来更方便,但是如果多次使用p初始化auto_ptr,在运行时退出作用域时,会出现重复释放内存的错误,如果使用方法1,一定要保证只能被一次初始化
方法2,推荐使用

0x12 get()函数【获取指针指向的内存地址】

{int *p = new int(4);auto_ptr<int> aptr0(p);cout << aptr0.get() << endl;    // 输出地址 0x8000284d0cout << p << endl;              // 输出地址 0x8000284d0cout << &p << endl;             // 0xffffcbd8
}

0x13 release()函数 【仅仅是释放所有权,但是并没有清空内存】

{int *ptr3 = new int(3);int *ptr4 = new int(4);auto_ptr<int> aptr5(ptr3);cout << *aptr5 << endl;aptr5.release();// release仅仅是释放所有权,但是并没有清空内存cout << *aptr5 << endl;  // run error
}

0x14 reset()函数 【旧值析构,重新设置指针】

{int *ptr3 = new int(3);int *ptr4 = new int(4);auto_ptr<int> aptr6(ptr3);cout << *aptr6 << endl;aptr6.reset(ptr4);// reset 旧值析构,重新设置指针cout << *aptr6 << endl;
}

0x2 迷惑点

0x21 迷惑点1 (拷贝赋值)

[ unique_ptr 通过禁止拷贝赋值 ]
赋值后影响aptr3的继续使用

{// 当2个auto_ptr 发生赋值时,内部指针所有权会发生转移,// 这意味着赋值右者对象会失去所有权,内部指针被设置为nullauto_ptr<int> aptr3(new int(111));auto_ptr<int> aptr4(new int(222));cout << *aptr3 << endl;cout << *aptr4 << endl;aptr4 = aptr3;cout << *aptr3 << endl;  // 此值为 null, 不可以使用nullptr判断,运行失败cout << *aptr4 << endl;
}

0x22 迷惑点2 (拷贝构造)

[ unique_ptr 通过禁止拷贝构造 ]
拷贝构造后影响aptr5的继续使用

{int *ptr3 = new int(3);int *ptr4 = new int(4);auto_ptr<int> aptr5(ptr3);cout << *aptr5 << endl;auto_ptr<int> aptr6(aptr5);cout << *aptr5 << endl; // RUN ERRORcout << *aptr6 << endl;
}

0x3 C++放弃 auto_ptr 的原因

0x31 原因1(拷贝行为结果不可控)

[ auto_ptr作为参数时 copy赋值后会被释放 ]
auto_ptr的拷贝行为是通过移动语义实现的,‌即内存所有权从一个auto_ptr对象转移到另一个auto_ptr对象。‌
由于auto_ptr没有提供拷贝构造函数和拷贝赋值运算符,‌它们会被编译器默认为移动构造函数和移动赋值运算符。‌【参考 0x2迷惑点 章节】
这意味着当将一个auto_ptr对象赋值给另一个auto_ptr对象时,‌源对象将失去对内存的控制权,‌可能导致程序出现不可预期的行为或内存泄漏。‌

void foo_test(auto_ptr<int> p2) {cout << *p2 << endl;
}
{auto_ptr<int> p1 = auto_ptr<int>(new int(3));// copy赋值后,p2会会被释放掉foo_test(p1);cout << *p1 << endl;
}

0x32 原因2 (不支持数组)

auto_ptr只能管理单个对象的动态内存分配,‌不能管理数组类型的动态内存分配。‌
如果使用auto_ptr来管理数组类型的动态内存分配,‌可能会导致内存泄漏或其他问题。

0x33 原因3 (STL容器不兼容)

由于auto_ptr的拷贝行为是移动语义,‌它不能与STL容器(‌如vector、‌map等)‌一起使用,‌否则可能会导致内存泄漏或其他问题。

[ auto_ptr作为vector的value,不能push进去 ]

// 编译失败
vector<auto_ptr<int>> Array;
auto_ptr<int> p(new int(3));
Array.push_back(p);

0x4 为了解决auto_ptr问题,引入unique_ptr

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

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

相关文章

NMEA 2000航空插头插座选择

一、概述 NMEA 2000航空插头插座是船舶电子设备中不可或缺的部分&#xff0c;它们负责在船舶的各种电子系统间传输数据和电源信号。选择合适的NMEA 2000航空插头插座对于确保船舶电子系统的稳定性和可靠性至关重要。本文将详细探讨如何选择合适的NMEA 2000航空插头插座&#xf…

NodeJS系列面试题

大家好&#xff0c;我是有用就扩散&#xff0c;有用就点赞。 有没有写过Koa中间件&#xff0c;说一下中间件原理&#xff0c;介绍下自己写过的中间件 koa本来就是一个轻量级框架&#xff0c;本身支持的功能并不多&#xff0c;功能都是通过中间件来实现不同的需求。开发者可以通…

Harmony学习(二)------ArkUI

ArkUI(方舟开发框架)是一套构建鸿蒙应用界面的框架&#xff0c;构建页面的最小单位就是组件&#xff0c;布局思路&#xff1a;先排版&#xff0c;再放内容&#xff0c;再美化。 官网图标库&#xff1a;HarmonyOS 主题图标库 | icon素材免费下载 | 华为开发者联盟 组件分类&am…

解决方案架构师系列 - AWS - Pinpoint

AWS Pinpoint介绍 Amazon Pinpoint 为营销人员和开发人员提供了一款可自定义的工具&#xff0c;助力他们大规模地开展跨渠道、行业和活动的客户通信。 Amazon Pinpoint是一个全面的客户参与平台&#xff0c;‌旨在帮助营销人员和开发人员大规模地开展跨渠道、‌行业和活动的客…

vivado INTERNAL_VREF

内部 具有差分输入缓冲器的单端I/O标准需要输入参考 电压&#xff08;VREF&#xff09;。当I/O组中需要VREF时&#xff0c;您可以使用专用VREF 引脚作为外部VREF电源&#xff0c;或使用INTERNAL_VREF内部生成的VREF 属性&#xff0c;或者对于UltraScale设备上的HP I/O组&#x…

【Golang 面试基础题】每日 5 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

如何定位及优化SQL语句的性能

定位及优化SQL语句的性能是一个复杂但至关重要的过程&#xff0c;它涉及到对数据库操作、索引使用、查询计划以及系统资源的深入理解。以下是一些步骤和技巧&#xff0c;可以帮助你定位并优化SQL语句的性能&#xff1a; 1. 使用EXPLAIN分析查询计划 执行EXPLAIN命令&#xff…

例行性工作crontab练习题

练习 请在5分钟后关闭系统中所有属于tab用户的进程&#xff0c;并用日志记录任务执行时间 基础知识&#xff1a; [rootlocalhost ~]# echo "date %F %R pkill tab finished" 2024-07-17 15:57 pkill tab finished ​ logger 123 将123写到/var/log/messages #法一&a…

Intellij IDEA 的Plugins加载不出来的解决方法

一、点开插件---右上角设置---HTTP代理设置 二、勾选自动检测代理设置 输入url&#xff1a; https://plugins.jetbrains.com/ 配置完成后&#xff0c;点击确定。 然后点击检查连接&#xff0c;再一次输入那个URL&#xff0c;一般来说可以连接成功了 然后 重启IDEA以刷新缓…

Android init常用调试工具

Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…

UE TSharedPtr

文章目录 概述TSharedPtrTSharedPtr包含2部分 构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;移动构造构造拷贝构造移动构造 小结 概述 之前写过一篇c的智能指针的&#xff0c;这篇写下ue的。本质上来说是差不多的&#xff0c;可以简单看看。 TSharedPtr 如下图&…

基于SpringBoot+Vue的篮球竞赛预约平台(带1w+文档)

基于SpringBootVue的篮球竞赛预约平台(带1w文档) 基于SpringBootVue的篮球竞赛预约平台(带1w文档) 本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;项目分类管理&#xff0c;竞赛项目管理&#xff0c;赛事预约管理&#xff0c;系统管理等诸多功…

2-40 基于Matlab编写的3维FDTD(时域有限差分算法)计算了球的RCS经典散射问题

基于Matlab编写的3维FDTD(时域有限差分算法)计算了球的RCS经典散射问题&#xff0c;采用PEC作边界&#xff0c;高斯波束激励。程序已调通&#xff0c;可直接运行。 2-40 3维FDTD 时域有限差分算法 - 小红书 (xiaohongshu.com)

Meta Quest3 激活更新不动的问题

1. Meta Quest3激活过程中遇到更新不动的情况&#xff0c;如下图所示&#xff1a; 2. 关机 3. 开机检查连接的wifi&#xff0c;是否存在受限的情况&#xff0c;如果存在受限情况&#xff0c;则说明当前的mofa只支持TCP&#xff0c;需要设置支持UDP模式。 具体操作是设置魔法…

细节决定成败:电商详情页全攻略

电子商务产品细节页面作为电子商务信息的主要承载页面&#xff0c;也是电子商务业务转型的主要战场。因此&#xff0c;商业详细页面的设计和规划是电子商务产品设计的核心&#xff0c;承担着转化率&#xff0c;甚至是产品设计的KPI。 电子商务作为传统商品交易在互联网领域的表…

探究比表面积测试的方法、仪器与原理-测试狗

探究比表面积测试的方法、仪器与原理 比表面积是指单位质量物质所具有的表面积&#xff0c;它是衡量物质性能的重要参数之一。比表面积测试在材料科学、环境保护、化工等领域具有广泛的应用。比表面积测试方法多样&#xff0c;仪器各异&#xff0c;下面测试狗就为大家介绍一些比…

Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)

文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185

Linux_线程的同步与互斥

目录 1、互斥相关概念 2、代码体现互斥重要性 3、互斥锁 3.1 初始化锁 3.2 申请、释放锁 3.3 加锁的思想 3.4 实现加锁 3.5 锁的原子性 4、线程安全 4.1 可重入函数 4.2 死锁 5、线程同步 5.1 条件变量初始化 5.2 条件变量等待队列 5.3 唤醒等待队列…

视觉网络的有效调制

摘要 链接&#xff1a;https://arxiv.org/pdf/2403.19963 在这项工作中&#xff0c;我们提出了高效调制&#xff08;EfficientMod&#xff09;&#xff0c;这是一种用于高效视觉网络的新型设计。我们重新审视了调制机制&#xff0c;该机制通过卷积上下文建模和特征投影层处理输…

Java并发(三)Java并发核心机制

J.U.C 简介 Java 的 java.util.concurrent 包&#xff08;简称 J.U.C&#xff09;中提供了大量并发工具类&#xff0c;是 Java 并发能力的主要体现&#xff08;注意&#xff0c;不是全部&#xff0c;有部分并发能力的支持在其他包中&#xff09;。从功能上&#xff0c;大致可以…