今天忙活了半天,结果发现罪魁祸首在使用了auto_ptr。

auto_ptr本身不含有赋值语义,所以在它赋值给别人(例如传参时),实际发生的是控制权的转移。

1 auto_ptr<TYPE> A,B; 2 A = B;

第二行执行完毕后,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相关推荐

  1. 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 ...

  2. http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html

    http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html

  3. Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...

    本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元测试,这是进行顺序测试.压力测试的基础.如果在Visual Studio 2 ...

  4. 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 ...

  5. 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 ...

  6. github上的优秀项目和开发环境配置【转http://www.cnblogs.com/2018/archive/2012/11/09/2763119.html】...

    github上的优秀项目和开发环境配置 国外的几个公司开放的资源  https://github.com/google https://github.com/facebook  https://git ...

  7. http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html(重要)

    http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html

  8. 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高的处理方式

  9. http://www.cnblogs.com/end/archive/2011/04/12/2013805.html

    http://www.cnblogs.com/end/archive/2011/04/12/2013805.html

  10. http://www.cnblogs.com/skyme/archive/2011/10/26/2223984.html

    http://www.cnblogs.com/skyme/archive/2011/10/26/2223984.html

最新文章

  1. StackGAN mini review
  2. “被狗啃”的按钮引发的开源社区信任危机
  3. layui 传递前端请求_前端请求后端,后端查询完毕传到前端 ,用layui 将 数据分页...
  4. python sql脚本_使用Python SQL脚本进行数据采样
  5. Spring 3.0: Unable to locate Spring NamespaceHandler for XML schema namespace
  6. iOS 添加使用特殊字体
  7. 一个普通java程序员的10年...泪奔 o(╥﹏╥)o o(╥﹏╥)o
  8. html数据如何分页显示,简单的html数据分页控件封装
  9. 设计模式(四) 策略模式
  10. css 小尖角,CSS3之尖角标签
  11. 【查缺补漏 | JAVA 基础知识 | 粗略复习②】
  12. 基于java的宠物管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
  13. 首阴战法胜率不高?应该是忘记加上一个大前提!
  14. php源码怎样修改logo,dedecms网站改logo怎么操作
  15. 计算机正在准备从D盘中回收,电脑一直显示正在启动怎么选择重灌系统
  16. 【Linux】查看网络接口(ifconfig | nmcli)
  17. 运维-Linux简介
  18. 人工生命全景图:如何创造出超越人工智能的生命系统
  19. webpack5打包图片报错——Module parse failed: Octal literal in strict mode 图片不能正常显示
  20. W800/W801学习记录网络部分(一):WIFI的扫描和连接

热门文章

  1. win10升级补丁_官方win10教育版怎么样
  2. mysql where查询字段是json,mysql json查询某字段包含a和b:
  3. 单链表学生管理系统(0723-林雪阵)
  4. 腾讯云cdn设置 php,腾讯云CDN开启中间源导致wordpress后台无法访问的最终解决办法...
  5. Windows分布式协调器
  6. ROS ros::NodeHandle nh(“~“)
  7. Word如何使用预设样式、自定样式以及生成自动目录教程
  8. IIS 禁用自动目录列表功能
  9. 第三次作业(尤心心)
  10. connect etimedout php,npm error: tunneling socket could not be established, cause=connect ETIMEDOUT