auto_ptr http://www.cnblogs.com/jtf-china/archive/2011/06/09/2076792.html
今天忙活了半天,结果发现罪魁祸首在使用了auto_ptr。
auto_ptr本身不含有赋值语义,所以在它赋值给别人(例如传参时),实际发生的是控制权的转移。
第二行执行完毕后,B的地址为0;
这就是智能指针auto_ptr的缺陷。倘若遇到类似的情况,还是用boost的shared_ptr吧。
另外转载一篇关于auto_ptr的文章,供自己学习。
http://blog.csdn.net/normallife/archive/2011/02/23/6202930.aspx
因为std::auto_ptr是转移语义,而STL容器的元素必须是值语义,也就是拷贝语义的。
比如,STL容器都是以副本的形式来保存元素。
std::vector<int> v;
int a = 1;
v.push_back(a);
v[0]也是值为1的int,但不是a..仅仅是一个副本.a的值也并未被改变.
std::auto_ptr<int> p1(new int);
std::auto_ptr<int> p2 = p1;
p2的构造修改了p1的值,使p1交出了对动态分配的int的引用权.此时p1不再引用动态int.这就是转移语义.
另外,std::auto_ptr为了达到转移语义的要求,只提供了这样的一个拷贝构造函数
auto_ptr(auto_ptr&); 而不是通常情况看到的T(const T&); 这就是一个非值语义的表现.
而std::vector因为对元素类型要求是值语义的,所以必须要求元素类型提供T(const T&)的拷贝构造函数.
它不能用于动态创建的数组。
可能是因为大部分时候用std::vector就很合适了,所以没有与auto_ptr相对应的auto_array。不过如果真的有特殊需要的话,也很容易仿照 std::auto_ptr写个auto_array。
使用auto_ptr要知道:
1. 智能指针不能共享指向对象的所有权
2. 智能指针不能指向数组。因为其实现中调用的是delete而非delete[]
3. 智能指针不能作为容器类的元素。
auto_ptr http://www.cnblogs.com/jtf-china/archive/2011/06/09/2076792.html相关推荐
- http://www.cnblogs.com/QJohnson/archive/2011/06/24/2089414.html
http://www.cnblogs.com/QJohnson/archive/2011/06/24/2089414.html 转载于:https://www.cnblogs.com/seasonss ...
- http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
- Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...
本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元测试,这是进行顺序测试.压力测试的基础.如果在Visual Studio 2 ...
- java中的多线程(转自http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html)
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: 1 2 3 4 5 6 7 8 9 10 11 ...
- Python线程指南 ---转自 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
Python线程指南 ---转自 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html 本文介绍了Python对于线程的支持,包括&q ...
- github上的优秀项目和开发环境配置【转http://www.cnblogs.com/2018/archive/2012/11/09/2763119.html】...
github上的优秀项目和开发环境配置 国外的几个公司开放的资源 https://github.com/google https://github.com/facebook https://git ...
- http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html(重要)
http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html
- https://www.cnblogs.com/lyhabc/archive/2013/06/12/3133273.html?tdsourcetag=s_pcqq_aiomsg
https://www.cnblogs.com/lyhabc/archive/2013/06/12/3133273.html?tdsourcetag=s_pcqq_aiomsg CPU高的处理方式
- http://www.cnblogs.com/end/archive/2011/04/12/2013805.html
http://www.cnblogs.com/end/archive/2011/04/12/2013805.html
- http://www.cnblogs.com/skyme/archive/2011/10/26/2223984.html
http://www.cnblogs.com/skyme/archive/2011/10/26/2223984.html
最新文章
- StackGAN mini review
- “被狗啃”的按钮引发的开源社区信任危机
- layui 传递前端请求_前端请求后端,后端查询完毕传到前端 ,用layui 将 数据分页...
- python sql脚本_使用Python SQL脚本进行数据采样
- Spring 3.0: Unable to locate Spring NamespaceHandler for XML schema namespace
- iOS 添加使用特殊字体
- 一个普通java程序员的10年...泪奔 o(╥﹏╥)o o(╥﹏╥)o
- html数据如何分页显示,简单的html数据分页控件封装
- 设计模式(四) 策略模式
- css 小尖角,CSS3之尖角标签
- 【查缺补漏 | JAVA 基础知识 | 粗略复习②】
- 基于java的宠物管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
- 首阴战法胜率不高?应该是忘记加上一个大前提!
- php源码怎样修改logo,dedecms网站改logo怎么操作
- 计算机正在准备从D盘中回收,电脑一直显示正在启动怎么选择重灌系统
- 【Linux】查看网络接口(ifconfig | nmcli)
- 运维-Linux简介
- 人工生命全景图:如何创造出超越人工智能的生命系统
- webpack5打包图片报错——Module parse failed: Octal literal in strict mode 图片不能正常显示
- W800/W801学习记录网络部分(一):WIFI的扫描和连接
热门文章
- win10升级补丁_官方win10教育版怎么样
- mysql where查询字段是json,mysql json查询某字段包含a和b:
- 单链表学生管理系统(0723-林雪阵)
- 腾讯云cdn设置 php,腾讯云CDN开启中间源导致wordpress后台无法访问的最终解决办法...
- Windows分布式协调器
- ROS ros::NodeHandle nh(“~“)
- Word如何使用预设样式、自定样式以及生成自动目录教程
- IIS 禁用自动目录列表功能
- 第三次作业(尤心心)
- connect etimedout php,npm error: tunneling socket could not be established, cause=connect ETIMEDOUT