切勿创建包括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的容器。

上一篇:串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧


下一篇:Erlang OTP学习:supervisor [转]