码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-07 00:48:57      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:stl   auto_ptr   所有权   对象   class   



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

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

auto_ptr<int> pint2(pint1);//pint2指向pint1intpint1被置为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

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

标签:stl   auto_ptr   所有权   对象   class   

原文地址:http://blog.csdn.net/fayery/article/details/38406929

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!