Home  >  Q&A  >  body text

c++ - QList方法at()与[]的区别

代码如下:

QList<QVariant> *list;
    for(int i=startrow;i<rowcount+1;i++)
    {
        list=axExcel1.GetSelectSheetOneRowDate(1,i,startcolumn,startcolumn+columncount-1);
        int len=list->length();
        for(int j=0;j<len;j++)
        {
            qDebug()<<list->at(j);
        }
        delete list;list=NULL;
    }

其中

axExcel1.GetSelectSheetOneRowDate(1,i,startcolumn,startcolumn+columncount-1)

返回一个QList<QVariant>*指针,我用list去接收这个指针,然后解析list。
当我使用at()时程序不会崩溃,但当我改为[]访问时如以下代码,程序在进入循环当j=1时在就会崩溃,请问这at()与[]有什么区别?为什么会崩溃?

 qDebug()<<list->[j];
 

错误提示如下:

Error - RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly

调试图片

天蓬老师天蓬老师2765 days ago625

reply all(2)I'll reply

  • PHPz

    PHPz2017-04-17 13:32:52

    [] has little semantic difference with at, and the implementation is similar
    Link from qt official source code

    template <typename T>
    inline const T &QList<T>::at(int i) const
    { 
        Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::at", "index out of range");
         
        return reinterpret_cast<Node *>(p.at(i))->t(); 
    }
    
    template <typename T>
    inline const T &QList<T>::operator[](int i) const
    { 
        Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::operator[]", "index out of range");
        
        return reinterpret_cast<Node *>(p.at(i))->t(); 
    }
    
    template <typename T>
    inline T &QList<T>::operator[](int i)
    { 
        Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::operator[]", "index out of range");
        detach(); // 这里多了一步 !! 
        return reinterpret_cast<Node *>(p.at(i))->t(); 
    }

    reply
    0
  • 怪我咯

    怪我咯2017-04-17 13:32:52

    The difference is that at performs an out-of-bounds check, [] does not

    reply
    0
  • Cancelreply