首页 > 代码库 > 切勿创建包含auto_ptr的容器对象

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



当你拷贝一个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的容器。