auto_ptr智能指针的用法及其成员函数说明

【C++】auto_ptr为何被唾弃?以及其他智能指针的学习 1. C++ 98中产生了第一个智能指针auto_ptr.给出了更实用的scoped_ptr和shared_ptr和weak_ptr.3. C++ TR1,引入了shared_ptr等。不过注意的是TR1并不是标准版。4. C++ 11,引入了unique_ptr和shared_ptr和weak_ptr。需要注意的是unique_ptr对应boost的scoped_ptr。并且这些智能指针的实现原理是参考boost中的实现的。 阅读详情

智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限。本文总结的8个问题足以涵盖auto_ptr的大部分内容。

 

1. auto_ptr是什么?

auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者。当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自动释放。即使发生异常,通过异常的栈展开过程也能将动态内存释放。auto_ptr不支持new 数组。

 

2. auto_ptr需要包含的头文件?

#include <memory>

 

3. 初始化auto_ptr对象的方法?

1) 构造函数

1] 将已存在的指向动态内存的普通指针作为参数来构造

int* p = new int(33);

auto_ptr<int> api(p);

2] 直接构造智能指针

auto_ptr< int > api( new int( 33 ) );

2) 拷贝构造

利用已经存在的智能指针来构造新的智能指针

auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) );

auto_ptr< string > pstr_auto2( pstr_auto );  //利用pstr_auto来构造pstr_auto2

因为一块动态内存智能由一个智能指针独享,所以在拷贝构造或赋值时都会发生拥有权转移的过程。在此拷贝构造过程中,pstr_auto将失去对字符串内存的所有权,而pstr_auto2将其获得。对象销毁时,pstr_auto2负责内存的自动销毁。

3) 赋值

利用已经存在的智能指针来构造新的智能指针

auto_ptr< int > p1( new int( 1024 ) );

auto_ptr< int > p2( new int( 2048 ) );

p1 = p2;

在赋值之前,由p1 指向的对象被删除。赋值之后,p1 拥有int 型对象的所有权。该对象值为2048。 p2 不再被用来指向该对象。

 

4. 空的auto_ptr 需要初始化吗?

通常的指针在定义的时候若不指向任何对象,我们用Null给其赋值。对于智能指针,因为构造函数有默认值0,我们可以直接定义空的auto_ptr如下:

auto_ptr< int > p_auto_int;  //不指向任何对象

 

5. 防止两个auto_ptr对象拥有同一个对象(一块内存)

因为auto_ptr的所有权独有,所以下面的代码会造成混乱。

int* p = new int(0);
auto_ptr<int> ap1(p);
auto_ptr<int> ap2(p);

因为ap1与ap2都认为指针p是归它管的,在析构时都试图删除p, 两次删除同一个对象的行为在C++标准中是未定义的。所以我们必须防止这样使用auto_ptr。

 

6. 警惕智能指针作为参数!

1) 按值传递时,函数调用过程中在函数的作用域中会产生一个局部对象来接收传入的auto_ptr(拷贝构造),这样,传入的实参auto_ptr就失去了其对原对象的所有权,而该对象会在函数退出时被局部auto_ptr删除。如下例:

void f(auto_ptr<int> ap)

{cout<<*ap;}
auto_ptr<int> ap1(new int(0));
f(ap1);
cout<<*ap1; //错误,经过f(ap1)函数调用,ap1已经不再拥有任何对象了。

2) 引用或指针时,不会存在上面的拷贝过程。但我们并不知道在函数中对传入的auto_ptr做了什么,如果当中某些操作使其失去了对对象的所有权,那么这还是可能会导致致命的执行期错误。

结论:const reference是智能指针作为参数传递的底线。

 

7. auto_ptr不能初始化为指向非动态内存

原因很简单,delete 表达式会被应用在不是动态分配的指针上这将导致未定义的程序行为。

 

8. auto_ptr常用的成员函数

1) get()

返回auto_ptr指向的那个对象的内存地址。如下例:

int* p = new int(33);

cout << "the adress of p: "<< p << endl;

auto_ptr<int> ap1(p);

cout << "the adress of ap1: " << &ap1 << endl;

cout << "the adress of the object which ap1 point to: " << ap1.get() << endl;

输出如下:

the adress of p: 00481E00

the adress of ap1: 0012FF68

the adress of the object which ap1 point to: 00481E00

第一行与第三行相同,都是int所在的那块内存的地址。第二行是ap1这个类对象本身所在内存的地址。

2) reset()

重新设置auto_ptr指向的对象。类似于赋值操作,但赋值操作不允许将一个普通指针指直接赋给auto_ptr,而reset()允许。如下例:

auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) );

pstr_auto.reset( new string( "Long -neck" ) );

在例子中,重置前pstr_auto拥有"Brontosaurus"字符内存的所有权,这块内存首先会被释放。之后pstr_auto再拥有"Long -neck"字符内存的所有权。

注:reset(0)可以释放对象,销毁内存。

3) release()

返回auto_ptr指向的那个对象的内存地址,并释放对这个对象的所有权。

用此函数初始化auto_ptr时可以避免两个auto_ptr对象拥有同一个对象的情况(与get函数相比)。

例子如下:

auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) );

auto_ptr< string > pstr_auto2( pstr_auto.get() ); //这是两个auto_ptr拥有同一个对象

auto_ptr< string > pstr_auto2( pstr_auto.release() ); //release可以首先释放所有权

原文转自:http://blog.sina.com.cn/s/blog_7708265a01010lyv.html

浅谈auto_ptr智能指针 在c++标准库里主要有三个智能指针: ①auto_ptr 在任何情况下都不要使用 ②scoped_ptr 独占空间,防拷贝和赋值,是对第①个智能指针的缺陷所作出的解决 ③shared_ptr 利用引用计数,和其他对象共享一块空间(与weak_ptr结合使用) 这篇文章主要的内容是讲解auto_ptr所引出的一系列问题: 一、AutoPtr智能指针 阅读详情

相关推荐

浅谈智能指针auto_ptr/shared_ptr/unique_ptr

一.智能指针1.引入我们通常使用类似new申请一块空间,交由一个指针指向,假如说最后忘记delete,将会造成内存泄露。而智能指针的出现,就是对这种问题的解决方式,智能指针类似指针,却可以用于管理动态分配的内存。本章所解说的是三种智能指针: (1)C++98提出,C++11摒弃的auto_ptr C++11新增的 (2)shared_ptr (3)unique_ptr 在

哒哒的博客 7421

C++智能指针unique_ptr 详解

一、智能指针 C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。 二、unique_ptr 简介 unique_ptr 是从 C++ 11 开始,定义在 <memory> 中的智能指针(smart pointer)。它持有对对象的独有权,即两个 unique_ptr 不能指向一个对象,不能进行复制操作只能进行移动操作。 unique_ptr 之所以叫这个名字,是因为它智能指向一个对象,即当它指向其

sinat_31608641的博客 9585

auto_ptr, unique_ptr, shared_ptr and weak_ptr智能指针讲解

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,优快云社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。优快云视频网址:http://edu.youkuaiyun.com/lecturer/144 C ++库提供以下类型的智能指针的实现: auto_ptrunique_ptrshared_ptrweak_pt

海洋个人博客 2171

智能指针类模板:auto_ptr、unique_ptr、shared_ptr的原理与使用

本文介绍了智能指针类模板的原理与使用,其中主要介绍了auto_ptr、unique_ptr、shared_ptr,它们有各自的特性,适用于不同的场景,同时也各有优点和缺陷。实际使用时要结合其特点进行选择。

baidu_38797690的博客 1512

Xilinx Aurora 8B/10B IP核详解和仿真

Xilinx Aurora 8b/10b IP核的详解,以及使用与仿真示例,对IP核的配置和如何仿真有非常详细的说明,除了对IP核官方文档的内容进行了解析以外,还对GTX引脚的选择等比较容易混淆和不好理解的地方进行了说明。最后对IP核的仿真运行进行了STEP BY STEP 的说明,对仿真的结果也进行了简要的说明。 该文档对Xilinx FPGA和ZYNQ SOC下 AURORA 8B/10B IP核的使用提供了一个快速上手的指导。

weixin_43354598的博客 1万+

利用SPSS实现逻辑回归,树模型,以及广义线性模型

本案例是IBM SPSS数据分析与挖掘实战案例精粹----第九章的学习记录 案例背景:分析出导致急救后迟发性颅脑损伤的主要影响因素,共有201项案例: 分析思路:先使用logistic回归模型进行影响因素筛选,然后利用分类树探索自变量中是否存在交互作用,最后利用广义线性模型过程拟合带交互项的Logistic回归模型 字段:性别,年龄,收缩压,舒张压,血小板,脑挫伤,中线位移,脑肿胀,入院意识,是否手术急救,其余急救措施,是否出现迟发性脑损伤; ...

hepan_defeng的博客 1万+

[C++11] 智能指针(auto_ptr(弃用)、unique_ptr、shared_ptr、weak_ptr)详细解读

这里主要解释auto_ptr、unique_ptr、shared_ptr、weak_ptr这几种智能指针。接下来我们对每一个指针类型进行详细说明。在 C++ 中,auto_ptr、unique_ptr、shared_ptr 和 weak_ptr四种智能指针主要用于管理动态分配的对象的生命周期。它们在所有权管理和内存安全方面有所不同。

wangdsh的博客 2567

RK3588 MPP视频编码实战:从环境搭建到高效封装

本文详细介绍了在RK3588平台上利用MPP(Media Process Platform)进行硬件视频编码的完整实战流程。从MPP库的环境搭建、编译安装,到核心编码参数(如码率控制、GOP、图像对齐)的深入解析,并提供了一个可复用的C++编码器类封装方案,帮助开发者快速实现高效的H.264/H.265视频编码,显著降低CPU占用。

weixin_29192211的博客 349

C++auto_ptr的用法

auto_ptr的用法

qq_67972375的博客 976

Mac 不小心断开移动硬盘导致磁盘无法读取和加载(顺利解决!)

Mac移动硬盘不正确断开连接导致无法读取加载的解决方法,亲测有效

Robin_Pi的博客 1万+

零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)

《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)

sara_han的博客 777

C++的智能指针auto_ptr、unique_ptr源码解析

C++的智能指针auto_ptr、unqiue_ptr源码解析1、前言2、源码准备3、源码解析3.1、auto_ptr解析3.2、unqiue_ptr解3.3、unqiue_ptr的一个偏特化版本4、智能指针相关内容的总结5、总结 1、前言 本文仅对C++智能指针auto_ptr、unqiue_ptr源码进行解析,需要读者有一定的C++基础并且对智能指针有所了解,本文并不对智能指针的使用方法、使用场景、效率等方面进行阐述分析,这些知识需自行查阅相关书籍去了解。 建议大家先看一下这篇文章《C++11的智能指

游戏行业资深搬砖人员 3427

“开宝五子棋陪练”-首款开放智能的五子棋习题练习安卓应用

使用Kotlin语言以及Jetpack Compose UI库开发,主要就是写Composable函数,显示棋盘、棋子和一些按钮,响应用户的点击和滑动操作,以及保存和恢复数据。但我针对本应用是用于做题的特殊需求,对该算法库做了一个简单的JNI层封装,方便UI前端Kotlin代码的调用。

weixin_44120030的博客 2398

C++智能指针的使用,auto_ptr,unique_ptr,shared_ptr,weak_ptr详解

C++智能指针的用法,auto_ptr,unique_ptr,shared_ptr,weak_ptr

liu20000505的博客 2313

网络变更:APIC 节点替换

Fabric Name,Controller ID,TEP Address Pool 等信息必须相同;如果故障设备是 APIC1 还需要重新配置管理密码。此过程可能需要 10 分钟左右,在此期间目标 APIC 可能在 Available/Unavailable 状态翻滚。APIC 获取 TEP 地址后,进入 fully-fit。通过 CLI 以及配置的密码登录目标 APIC。

m0_54931486的博客 322

dolphinscheduler服务注册中心源码解析(一)服务注册与发现整体设计

下一篇文章我们开始讲解dolphinscheduler基于Zookeeper实现注册中心的源码解析。

最爱嫣夜来 376

C++ auto_ptr智能指针的用法

C++ auto_ptr智能指针的用法

愤怒的小狐狸----博客专栏 3万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【C++】智能指针——auto_ptr,unique_ptr,shared_ptr

1.智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时 ++或--,这个操作不是原子的,引用计数原来是1,++了两次,可能还是2.这样引用计数就错 乱了。旧的智能指针的会转移给新的智能指针,而旧的智能指针的会被置空。解决方案:在引用计数的场景下,把节点中的_prev和_next改成weak_ptr就可以了,weak_ptr不会增加引用计数,代码示意。该问题是有类似于链表节点的结构引起的,当外部的智能指针都释放了,就拿不内部的智能指针,那么节点就不会释放。使用方法参考官方文档。

2301_79796701的博客 1842

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++智能指针auto_ptr、unique_ptr、shared_ptr、weak_prt详解

C++智能指针auto_ptr、unique_ptr、shared_ptr、weak_prt详解

GodFishhh的博客 2468

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++智能指针——auto_ptr详解

前言 从之前智能指针的介绍中可以了解到智能指针主要作用是管理内存,避免内存泄漏和悬垂指针。 之前介绍的不管是智能指针与引用计数详解还是智能指针与句柄详解,其核心就是通过一个类来管理被new出来的对象,具体的技术就是靠引用计数。 auto_ptr介绍 auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。该智能指针已...

yj_android_develop的博客 1万+

C++ 智能指针的原理:auto_ptr、unique_ptr、shared_ptr、weak_ptr

介绍C++的智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr。介绍了每种智能指针的作用和特点,以及它们的实现原理,同时介绍了shared_ptr的循环引用的问题,以及如何解决循环引用。

weixin_57761086的博客 2523

c++系列 —— 智能指针auto_ptr和unique_ptr

智能指针unique_ptr分析以及与auto_ptr进行对比

weixin_37620587的博客 2882

已经消失的智能指针——auto_ptr

动态内存的管理是通过一对运算符来完成的: new,在动态内存中为对象分配空间并返回一个指向改该对象的指针。 delete,接收一个动态对象的指针,销毁该对象,并释放与之关联的内存。 出现问题:不能确保在正确的时间释放它: 有时候我们会忘记释放内存,这种情况下会产生内存泄漏 有时候再尚有指针引用内存的时候指针被释放了

双鱼座boyy的博客 2696

c++智能指针(2) -- auto_ptr

auto_ptr 名称(new 空间),// 类型: 智能指针指向的类型,空间:智能指针管理的空间// 创建一个p1的智能指针对象,其指向int类型的数据,动态开辟一个int类型的空间作为参数(其内部的指针会指向这片空间)// 创建一个空对象,指向int类型的数据,其内部的指针会指向NULL。

weixin_68026222的博客 1328

C++ 浅谈之智能指针 auto_ptr 和 unique_ptr 对比

智能指针 auto_ptr 和 unique_ptr 对比

优质后端技术知识记录 821

C++之智能指针auto_ptr

当你在读这篇文章的时候,应该都有这样一个疑问?那就是为什么要使用智能指针。 我们先看这样一个示例: #include <iostream> #include <string> #include <exception> using std::string; void memory_demo1() { string* str = new string("今天又找了一天的bug,太累了!!!"); std::cout << *str

DYDlove的博客 1905
上一篇: vector类 的属性和用法
下一篇: 方向导数与梯度
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值