zoukankan      html  css  js  c++  java
  • 切勿创建包括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的容器。

  • 相关阅读:
    JQuery UI
    JQuery 插件
    JQuery Ajax
    varchar和Nvarchar区别
    git冲突解决
    jquery ajax 提交信息后等待返回的提示信息
    Oracle错误 ORA-12560如何解决
    putty ssh连接老断
    myeclipse操作记录
    HTML与HTML5笔记
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7160652.html
Copyright © 2011-2022 走看看