当你拷贝一个auto_ptr时,它所指向的对象的全部权被移交到拷入的auto_ptr上,而它自身被置为NULL。我的理解是:拷贝一个auto_ptr意味着改变它的值。比如:

auto_ptr<int> pint1(new int);//pint1指向一个int

auto_ptr<int> pint2(pint1);//pint2指向pint1的int。pint1被置为NULL

pint1 = pint2;//如今pint1又指向int了;pint2被置为NULL

在看一种实现sort的方法:

template<class RandomAccessIterator, classCompare>

void sort(RandomAccessIterator first,RandomAccessIteratorlast,Compare comp)

{

typedeftypename iterator_traits<RandomAccessIterator>::value_type ElementType;

RandomAccessIterator i;

…                   
//使i指向基准元素

ElementType pivotValue(*i);//把基准元素复制到局部暂时变量中

…

}

vector<auto_ptr<int>>ints;

…

sort(ints.begin(),ints.end(),greater());

当我们使用iterator_traits<RandomAccessIterator>::value_type时。必须在它的前面加上typename,由于它是由模板參数来决定的类型名,在这个样例中。參数是RandomAccessIterator。

上面的代码中有问题的语句是:

ElementType pivotValue(*i);

由于它把一个元素从被排序的区间中复制到一个暂时对象中。在我们这个样例中。该元素是一个auto_ptr<int>,所以这一操作悄悄地把被拷贝的auto_ptr---就是在vector中的那个置为NULL。

更严重的是,当pivotValue的作用域结束时,它会自己主动删除自己所指向的int。因此,当对sort的调用返回时。vector中的内容已经被改变了,至少有一个int都被删除了。

千万别创建包括auto_ptr的容器。

切勿创建包括auto_ptr的容器对象的更多相关文章

  1. 条目十二《切勿对slt容器的线性安全性又不切实际的依赖》

    条目十二<切勿对slt容器的线性安全性又不切实际的依赖> 这一条目,我想用简短而有力的语句来总结. stl库是为了照顾大多数情况,而不是某一领域,如果在库层次实现线性安全,很大可能是对性能 ...

  2. 条目七《如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉》

    如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉 在STL中容器是智能的,可以在容器销毁时自动调用容器里对象的析构函数来销毁容器存储的对象. STL的容器虽然比较智能 ...

  3. IoC COntainer Create Javabeans 可以通过读取beans.xml 文件来创建一个应用程序上下文对象 依赖反转

    Spring初学快速入门 - Spring教程™ https://www.yiibai.com/spring/spring-tutorial-for-beginners.html# pom <? ...

  4. Matplotlib数据可视化(2):三大容器对象与常用设置

      上一篇博客中说到,matplotlib中所有画图元素(artist)分为两类:基本型和容器型.容器型元素包括三种:figure.axes.axis.一次画图的必经流程就是先创建好figure实例, ...

  5. 到底创建了几个String对象?

    到底创建了几个String对象? 标签: 堆栈使用 对象创建 分类: 开发技术 关键字: java 面试题 string 创建几个对象 作者:臧圩人(zangweiren) 网址:http://zan ...

  6. 条目二十二《切勿修改set或multiset的键》

    条目二十二<切勿修改set或multiset的键> 所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其元素保持有序的基础之上的 ...

  7. 条目八《永不建立auto_ptr的容器》

    条目八<永不建立auto_ptr的容器> 重要的事说三次,永不建立auto_ptr的容器,永不建立auto_ptr的容器,永不建立auto_ptr的容器!!! 为什么? 实质是auto_p ...

  8. Hive脚本中切勿使用/**/注释

    Hive脚本中切勿使用/**/注释 Hive脚本的注释目前好像只有 -- ,我之前在做初版数据的时候 使用NotePad++ 习惯性的有时候注释会写成 /**/ ,然后就引发了问题 脚本上传到hue, ...

  9. 假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。

    CSomething a(); CSomething b(2); CSomething c[3]; CSomething &ra = b; CSomething d=b; CSomething ...

随机推荐

  1. Ioc 之 Unity的AOP功能

    前面我们介绍了Unity的依赖注入功能,现在来介绍下Unity的AOP功能.AOP是面向切面编程,它能够使我们在不改变现有代码结构的情况下额外的为其添加一些功能. 我们还是使用配置文件来对类型进行注入 ...

  2. 苹果面临起诉:App Store 涉嫌垄断吗?

    今日导读 现代社会,手机在手,啥也不愁.购物不用带钱包,网上支付可以搞定一切:旅游懒得背相机,修图 App 帮你打造最美的自己.看直播.学英语.玩游戏.听音乐,我们的生活已经充斥着各类 App.据悉, ...

  3. vue中状态管理vuex的使用分享

    一.main.js中引入 store import store from './store' window.HMO_APP = new Vue({ router, store, render: h = ...

  4. 888. Fair Candy Swap@python

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  5. js实现音量拖拽的效果模拟

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>js ...

  6. Ext 6.5.3 classic版本,自定义实现togglefield开关控件

    1,在Ext 6.5.3的classic版中没有提供开关控件,参照modern版中 togglefield开关的实现,继承滑动器(sliderfield),自定义一个开关按钮.支持value绑定和点击 ...

  7. canvas之刮刮乐

    效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. python 连接docker

    发现15年写过的一小段,先mark一下,后续玩儿起来 import docker c = docker.Client(base_url='unix://var/run/docker.sock',ver ...

  9. python基础知识04-散列类型运算优先级和逻辑运算

    散列类型 1.集合 定义集合 se = {1,2,3,4} se = set()定义空集合 se = {1,3,5,7} se2 = {1,3,8,9} se & se2 {1,3} 交集 s ...

  10. 【转】错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有--解决方案

    SQL 错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有 01591. 00000 -  "lock held by in-doubt distributed ...