切勿创建包含auto_ptr的容器对象



当你拷贝一个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的容器对象,布布扣,bubuko.com

时间: 2025-01-20 01:45:21

切勿创建包含auto_ptr的容器对象的相关文章

Effective STL 第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

STL中的容器相当"聪明",它们提供了迭代器,以便进行向后和向前的遍历(通过begin.end.rbegin等):它们告诉你所包含的元素类型(通过它们的value_type类型定义):在插入和删除的过程中,它们自己进行必要的内存管理:它们报告自己有多少对象,最多能容纳多少对象(分别通过size和max_size):当然,当它们自身被析构时,它们自动析构所包含的每个对象. 有了这么"聪明"的容器,许多程序员不再考虑自己做善后清理工作.更糟糕的是,他们认为,容器会考虑为

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

如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉 在STL中容器是智能的,可以在容器销毁时自动调用容器里对象的析构函数来销毁容器存储的对象. STL的容器虽然比较智能,但是没有智能到可以自动销毁new出来的指针对象. 所以在使用STL中的容器时,如果保存的是mew出来的对象的指针.如果在容器销毁之前没有把new出来的对象释放,会造成内存泄露. 解决方法版本一: 这种手工释放容器里new的对象不太可靠,菲异常安全的.如果在delete的时候爆出异常,那么还是会引起

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 Window 对象集合 集合 描述 frames[] 返回窗口中所有命

一.JSX简介 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下(JS写法) var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var

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

条目八<永不建立auto_ptr的容器> 重要的事说三次,永不建立auto_ptr的容器,永不建立auto_ptr的容器,永不建立auto_ptr的容器!!! 为什么? 实质是auto_ptr指针在转移时把原本的指针置为NULL,然而在STL容器中的一些操作是包含数据转移操作的. 比如排序sort(),在STL中,容器的sort的底层是基于多种排序算法的,其中的快排更是最重要的一种.快排的核心是每次递归选出一个基准值,然后把数据分为大小于基准值两部分,直至整个数据排列完成. 假如是auto_p

C++ 容器对象vector和list 的使用

在<<c++ primer>>第四版Exercise Section 9.3.4 的Exercise 9.20 是这样的一道题目:编写程序判断一个vector<int> 容器包含的元素是否与list<int> 容器完全相同.测试代码如下: 1 #include "stdafx.h" 2 #include <iostream> 3 #include <string> 4 #include <list> 5

c++ 子类切勿重新定义父类 non-virtual函数

子类如果重新定义了父类的non-virtual函数则不会有多态效果. 为方便描述,这里的方法和继承方式都用public.至于原因嘛,你懂的! 1:子类直接继承父类方法 class BaseOption { public: void Function(); }; void BaseOption::Function() { cout<<"BaseOption::Function()"<<endl; } class SubOption : public BaseOpt

Chapter 2 User Authentication, Authorization, and Security(10):创建包含数据库

原文出处:http://blog.csdn.net/dba_huangzj/article/details/39473895,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,任何人不得以"原创"形式发布,也不得已用于商业用途,本人不负责任何法律责任. 前一篇:http://blog.csdn.net/dba_huangzj/article/details/39003679 前言: 在SQL Se

强大的道德***和***测试操作系统(仅提供参考学习!请在法律的范围使用!切勿触犯法律!)

道德hk和shentou测试操作系统今天收到了一个新的安装媒体,带来了许多更新和新工具,以及许多其他改进.它是一个基于Arch Linux的发行版,专为shentou测试人员和安全研究人员设计,并包含大量shentou测试和安全实用程序,已宣布发布2019.06.01版本. 由最新和最先进的稳定Linux 5.1.4内核提供支持,将引入150多个新工具,一个更新的1.1.1版安装程序,一个新的"jedi-vim"插件,提供绝地自动完成库到VIM编辑器,以及其他几个更新的VIM插件. 这

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

Hive脚本中切勿使用/**/注释 Hive脚本的注释目前好像只有 -- ,我之前在做初版数据的时候 使用NotePad++ 习惯性的有时候注释会写成 /**/ ,然后就引发了问题 脚本上传到hue,加入调度,调度正常执行 不报错,但是应该有的数据却为空!!! 奇了怪了.... (反复执行了好多遍,都没有数据,脚本都没有问题呀  一段一段copy执行的时候都正常的) 再仔细看看 ,原因问题出在注释上,在hive脚本里面我不小心留了两行注释 格式为 /* 注释内容 */ 的内容 造成的结果:  /