首页 > 代码库 > 切勿创建包含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指向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的容器。