C++基础知识 - auto_ptr智能指针 (C++98)

2023-11-06

auto_ptr 使用详解 (C++98)

  • auto_ptr 是c++ 98定义的智能指针模板,其定义了管理指针的对象,可以将new 获得(直接或间接)的地址赋给这种对象。当对象过期时,其析构函数将使用delete 来释放内存!

  • 用法:
    头文件: #include < memory>
    用 法: auto_ptr<类型> 变量名(new 类型)

  • 例 如:

    auto_ptr< string> str(new string("我要成为大牛~ 变得很牛逼!"));	//string类型
    auto_ptr<vector< int>> av(new vector<int>(10));					//int类型
    

Demo

#include <iostream>
#include <string>
#include <exception>
#include <memory>
using namespace std;

class Test {
public:
    Test() { cout << "Test is construct" << endl;  val = 666; }
    ~Test() { cout << "Test is destruct" << endl; }
    int getVal() { return val; }
private:
    int val;
};

void memory_leak_demo1() {
    auto_ptr<Test>t (new Test());

    //在使用智能指针访问对象的时候, 使用方式和普通指针一样
    cout << t->getVal() << endl;
    cout << (*t).getVal() << endl;

    //release取消智能指针对动态内存的托管
    //Test* tmp = t.release();    
    //delete tmp;   //必须手动释放内存

    //reset重置智能指针托管的内存地址, 
    //如果传递参数的地址不一致,原来的会被析构掉
    t.reset(new Test());
}

int main(){
    memory_leak_demo1();
    system("pause");
    return 0;
}

使用建议:

1.尽可能不要将auto_ptr 变量定义为全局变量或指针
2.除非自己知道后果,不要把auto_ptr 智能指针赋值给同类型的另外一个 智能指针
3.C++11 后auto_ptr 已经被“抛弃”,已使用unique_ptr替代!

auto_ptr陷阱

//弊端1. auto_ptr 被C++11 抛弃的主要理由 p1= p2 ,复制或赋值都会改变资源的所有权
	auto_ptr<string> p1(new string("张三"));
	auto_ptr<string> p2(new string("李四"));
	printf("p1: %p\n", p1.get());
	printf("p2: %p\n", p2.get());

	p1 = p2;
	printf("after p1 = p2\n");
	printf("p1: %p\n", p1.get());	
	printf("p2: %p\n", p2.get());

	
//弊端2. 在 STL 容器中使用auto_ptr存在重大风险,
//因为容器内的元素必需支持可复制(copy constructable)和可赋值(assignable)。
    vector<auto_ptr<string>> s1;
    auto_ptr<string> p1(new string("张三"));
    auto_ptr<string> p2(new string("李四"));

    s1.push_back(move(p1));
    s1.push_back(move(p2));

    cout << s1[0].get() << endl;
    cout << s1[1].get() << endl;
    //赋值操作
    s1[1] = s1[0];
    cout << s1[0].get() << endl;
    cout << s1[1].get() << endl;


//弊端3. 不支持对象数组的内存管理
	auto_ptr<int[]> a1(new int[5]);
	


//auto_ptr陷阱4, 不能把多个auto_ptr类型的指针指向同一段内存地址
   {
       auto_ptr<string>t2;
       string* str = new string("智能指针的内存管理陷阱");
       t2.reset(str); 
       {
           auto_ptr<string> t1;
           t1.reset(str);  //t1释放了 str 的内存
       }
       cout << *str << endl;   //再次访问, 就会导致越界
   }   //作用域结束的时候, t2再次释放 str 内存
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础知识 - auto_ptr智能指针 (C++98) 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 线程同步及互斥锁

    线程同步的概念 线程同步 指一个线程发出某一功能调用时 在没有得到结果之前 该调用不返回 同时其它线程为保证数据一致性 不能调用该功能 线程同步的例子 创建两个线程 让两个线程共享一个全局变量int number 然后让每个线程数5000次
  • 使用 ffmpeg 转换视频格式

    ffmpeg 是 nix 系统下最流行的音视频处理库 功能强大 并且提供了丰富的终端命令 实是日常视频处理的一大利器 实例 flac 格式转 mp3 音频格式转换非常简单 ffmpeg i input flac acodec libmp3l
  • 【Prometheus】“discovery manager scrape“ discovery=file msg=“Error reading file“ path=/dir err=“\“labl

    Prometheus discovery manager scrape discovery file msg Error reading file path dir err lable name is not a valid label n
  • 爬虫之JS解析,Python模拟JS代码运行。(附带模拟人人网登录案例)

    六 JS解析 1 定位js文件 1 通过initiator定位到js文件 2 通过search搜索关键字定位到js文件 3 通过元素绑定的事件监听函数找到js文件 Event Listeners 注 三种方法不能保证每一种都能找到js文件
  • 微信小程序与低功耗蓝牙通信-往硬件端发送数据(三)

    准备工作 软件 微信小程序 硬件 蓝牙设备 hc 09 单片机 stm32 微信小程序往硬件端发送数据 对应的函数是wx writeBLECharacteristicValue 他的参数是 对应的下面的参数获取有2种获取方式 1 通过硬件的
  • WebSocket不同版本的三种握手方式以及一个Netty实现JAVA类

    一 WebSocket不同版本的三种握手方式 WebSocket是HTML5中的新特性 应用也是非常的广泛 特别是用户WEB端与后台服务器的消息通讯 如阿里的WEBWW就是使用的WebSocket与后端服务器建立长连接进行的通讯 目前Web
  • RAM IP Core

    官方文档 ZYNQ 存储资源指导手册 DS109 RAM 全称 Random Access Memory 随机存取存储器 随时将数据写入任意指定地址的存储单元 或从任意地址读出数据 读写的速度是由时钟频率决定的 RAM主要用于存放程序运行的
  • mysql 分布式 hbase_分布式数据库 HBase(详解)

    一 概述 1 从BigTable说起BigTable是一个分布式存储系统 总的来说 BigTable 具备以下特性 支持大规模海量数据 分布式并发数据处理效率极高 易于扩展且支持动态伸缩 适用于廉价设备 适合于读操作不适合写操作 2 HBa
  • val()、html()方法改变元素值后,元素change事件无效解决方案

    原因 Change事件触发有两个必要条件 值改变 失去焦点 解决方法 改变值的同时 1 手动触发change事件 input val change input val trigger change 2 手动触发blur事件 input va
  • C++11 之 auto & decltype

    文章目录 auto decltypes auto 和 decltype 的配合 返回值类型后置 关于 c 11 新特性 最先提到的肯定是类型推导 c 11 引入了 auto 和 decltype 关键字 使用他们可以在编译期就推导出变量或者
  • 【Python秒杀脚本】淘宝或京东等秒杀抢购

    文章目录 一 环境 二 安装 三 淘宝秒杀脚本 四 京东秒杀脚本 五 总结 六 零基础小白的Python学习资源总结 一 Python所有方向的学习路线 二 Python课程视频 三 全套PDF电子书 四 清华编程大佬出品 漫画看学Pyth
  • GT1151多点触摸屏例程

    include
  • python连接hive_python连接hive

    参考 https blog csdn net a6822342 article details 80713652 简单 https www zhihu com question 269333988 复杂点的 方法一 ali bigdata
  • SDCC 2017优秀专题线上展第一站:大数据技术实战峰会首解密

    SDCC始创于2007年 十年长空 历久弥新 2016年 SDCC已分别在上海 深圳 成都 杭州 北京五地举办系列峰会 广受当地开发者欢迎 其中 北京作为年度收官之作 聚焦最前沿技术成果 汇聚年度最强实践案例 为中国软件开发者们呈献了一份年
  • 创建spring boot后启动报错: Failed to bind properties under ‘spring.datasource‘

    这种问题在于我们使用 yml文件时候的格式出现了问题造成的 我们深入探讨一下 application properties与application yml之间的区别 看了一篇文章说以前一直用的是application properties
  • VMWare安装Deepin系统

    01 点击 创建新的虚拟机 02 选择 自定义 高级 点击下一步 03 选择 稍后安装操作系统 点击下一步 04 客户机操作系统选择Linux L Deepin是基于Ubuntu64位制作所以版本 V 选择Ubuntu 64位 点击下一步
  • kafka如何保证消息不被重复消费

    1 原因 1 kafka有个offset的概念 当每个消息被写进去后 都有一个offset 代表他的序号 然后consumer消费该数据之后 隔一段时间 会把自己消费过的消息的offset提交一下 代表我已经消费过了 下次我要是重启 就会继
  • 模式识别学习初感悟

    学习模式识别已经快一个月了 从开始的混沌迷茫到现在的小有感觉 不能说自己进步了很多 只能说自己没有虚度这一个月的时光 下面相对自己这一个月的学习做一个总结 希望各位老师同学能多提宝贵意见 毕竟学术要在交流中才能发展 考研的生活结束后 顺利进
  • HTML中使用input type="file"时,不允许修改value属性值

    在HTML中使用
  • C++基础知识 - auto_ptr智能指针 (C++98)

    auto ptr 使用详解 C 98 auto ptr 是c 98定义的智能指针模板 其定义了管理指针的对象 可以将new 获得 直接或间接 的地址赋给这种对象 当对象过期时 其析构函数将使用delete 来释放内存 用法 头文件 incl