[C++标准模板库:自修教程与参考手册]关于auto_ptr
什么是auto_ptr指针
auto_ptr是这样一种指针:它是“它所指的对象”的拥有者,所以,当身为对象拥有者的auto_ptr指针被摧毁时,该对象也会被摧毁,auto_ptr要求一个对象只能拥有一个拥有者,严禁一物二主。
注意:auto指针不能用一般指针惯用的赋值初始化方式,必须直接使用数值来完成初始化。
std::auto_ptr<ClassA> ptr1(new ClassA);//这是正确的
std::auto_ptr(ClassA) ptr2=new ClassA;//这是错误的
关于拥有权的转移
//创建一个auto_ptr,指向A类
std::auto_ptr<ClassA> ptr1(new ClassA);
//将所有权转移给ptr2
std::auto_ptr<ClassA> ptr2(ptr1);
在第一个语句中,ptr1拥有那个new出来的对象,在第二个语句中由ptr1转交给ptr2。此后ptr2就拥有了那个被new出来的对象,而ptr1就不再拥有它。这样,对象就只会被摧毁一词——就是在ptr2被销毁的时候。如果ptr2在被赋值前拥有另一个对象,那么会先调用该对象的delete,将这个对象删除。(在拥有权转移后,指针ptr1就变成了一个null指针)
起点和终点
拥有权的转移,使得auto_ptr产生了特殊的用法:某个函数可以利用auto_ptr将拥有权转交给另一个函数,这种事情可能发生在两种情况下:
- 某函数是数据的终点。如果auto_ptr以by value的方式当做一个参数传递给某个函数,就是这种情况。此时被调用端的参数获得了这个auto_ptr的拥有权,如果该函数不将它传递出去,它所指的对象就会在函数退出时被删除。
void sink(std::auto_ptr<ClassA>);
- 某函数时数据的起点。当一个auto_ptr被返回,其所有权便被转交给调用端了:
std::auto_ptr<ClassA> f()
{
std::auto_ptr<ClassA> ptr(new ClassA);
....
return ptr;
}
void g()
{
std::auto_ptr<ClassA> p;
for(int i=0;i<n;i++){
p=f();
}
}
每当f()被调用,它都new一个新对象,然后把该对象连同其拥有权一起返回给调用端。将返回值赋值给p,同时也完成了所有权的转移,p原来指向的对象会被销毁,离开g()时,p也会被删除。
缺陷
auto_ptr的语义本身就包含了拥有权,所以如果你无意交出你的拥有权,就不要再参数列表中使用auto_ptr,也不要以它为返回值,比如下面这个例子就是错误的:
void print(std::auto_ptr<T>p){
if(p.get()==null)
std::<<"null";
else
std::cout<<*p;
}
只要有一个auto_ptr被当做参数,它所拥有的对象在这个函数退出时候都会被删除,这可能不是你想要的结果。
你可能会认为,将auto_ptr以pass by reference传递就万事大吉。然而这种行为会使“拥有权”的概念变得难以捉摸。因为面对一个“透过reference而获得auto_ptr”的函数,你根本无法知道它的所有权是否已经给出,所以这种情况应该全力避免。
不过,我们可以使用const reference,向函数传递拥有权,比如这样:
const std::auto_ptr<ClassA> ptr(new ClassA);
*p=2;
print(p);
这样的方案使得auto_ptr比以前显得更加安全些。很多接口在需要内部拷贝时,都通过constant reference来获得原值。关键字constant并不意味着你不能改变auto_ptr所拥有的对象,而是说你不能改变对象的所有权。
auto_ptr需要注意的地方
- auto_ptrs之间不能共享拥有权
我觉得这一条应该不用解释了。 - 并不存在针对array而设计的auto_ptrs
auto_ptr不可以指向array,因为auto_ptr使用的是delete而不是
delete[]来释放其所拥有的对象。
[C++标准模板库:自修教程与参考手册]关于auto_ptr的更多相关文章
- [C++标准模板库:自修教程与参考手册]关于deque
Deque的基本概念 deque和vector很相似,也提供随机存取的能力,将元素都动态地存储在一个数组中,最大的区别就是:deque的头和尾都是开放的,非常方便在头尾两端进行一些操作.(重点在于:d ...
- [C++标准模板库:自修教程与参考手册]关于vector
什么是vector 可以这样认为,vector就是一个动态的数组,其中的元素必须具备assignable(可赋值)和copyable(可拷贝)两个性质. vector的一些重要的性质 vector支持 ...
- STL 简介,标准模板库
这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL. 当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...
- c++学习书籍推荐《数据结构C++语言描述:应用标准模板库STL(第2版)》下载
本书是Ford和Topp两位教授于1996看出版的名著Data Structures with C++的第2版,在全球范围内已经有数以万计的学生从中受益.作者将C++语言作为算法描述语言,应用包含规范 ...
- 7.4 C++标准模板库(STL)的概念
参考:http://www.weixueyuan.net/view/6401.html 总结: 标准模板库为C++提供了完善的数据结构及算法. 标准模板库包括三部分:容器.算法和迭代器. 容器是对象 ...
- 如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类
本文翻译自 https://support.microsoft.com/zh-cn/help/168958/how-to-export-an-instantiation-of-a-standard-t ...
- C++标准模板库(STL)和容器
1.什么是标准模板库(STL)? (1)C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板 ...
- 标准模板库(STL)学习指南之sort排序
对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思 ...
- C++标准模板库Stand Template Library(STL)简介与STL string类
参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...
随机推荐
- 15. MongoDB系列之选择片键
1. 片键类型 1.1 升序片键 升序片键通常类似于date或ObjectId--随着时间稳步增长的字段. 这种模式通常会使MongoDB更难保持块的平衡,因为所有的块都是由一个分片创建的. 1.2 ...
- 10.MongoDB系列之副本集组成
1. 同步 复制是指多台服务器保持相同的数据副本.MongoDB通过保存操作日志(oplog)实现复制功能. oplog存在于主节点local数据库中的一个固定集合,包含了主节点执行的每一次写操作. ...
- Docker_基础知识
容器概述 容器本义:盛装物体.隔离物体. 容器意义:解决虚拟化资源浪费的问题. 容器沿革:1979---2013--- 版本:企业版(EE)/社区版(CE)1. ...
- 自建流媒体如何录制视频。齐博x1齐博x2齐博x3齐博x4齐博x5齐博x6齐博x7齐博x8齐博x9齐博x10
http://x1.eapis.site/ 先打开配置文件\conf\config.php 里边的内容大概如下,第一项是必须要配置的,换成你的网站域名网址.第二项,如果流媒体服务器配置了https证书 ...
- 第二阶段:高级核心基础知识·第4章shell特性·2
1.统计日志,日志内容 39.96.187.239 - - [11/Nov/2019:10:08:01 +0800] "GET / HTTP/1.1" 302 0 "-& ...
- 九、docker swarm主机编排
一. 什么是Docker Swarm Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/do ...
- 苹果iOS App上架流程,非iOS开发人员上架教程
iOS应用上线发布流程一般包含相关证书文件的配置.Xcode的设置.App Store Connect填写App的相关信息.ipa包上传.审核结果以及相关邮件回复.相关证书文件的配置与Xcode的 ...
- Nginx配置-1
1.绑定nginx到指定cpu [root@nginx conf.d]# vim /apps/nginx/conf/nginx.conf worker_processes 2; worker_cpu_ ...
- 如何在.NET程序崩溃时自动创建Dump?
今天在浏览张队转载文章的留言时,遇到一个读者问了这样的问题,如下图所示: 首先能明确的一点是"程序崩溃退出了是不能用常规的方式dump的",因为整个进程树都已经退出.现场已经无法使 ...
- 20_Vue如何监测数组类型数据发生改变的?
通过上一节,我们知道了vue检测对象数据发生改变的原理 但是还有个api我们没有讲解,Vue.set(): 这个API比较适合在理解了对象检测的原理后进行讲解 案例准备 html <!-- 创建 ...