• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            QList內存釋放 (收集轉載及編輯)

            Posted on 2011-04-19 22:49 RTY 閱讀(3847) 評論(0)  編輯 收藏 引用 所屬分類: Qt

            QList<T> 的釋放分兩種情況:

            1.T的類型為非指針,這時候直接調用clear()方法就可以釋放了,看如下測試代碼

            #include <QtCore/QCoreApplication>#include <QList>#include <QString>
            int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    typedef struct _test    {        int id;        QString name;        QString sex;    }Por_test;    QList<Por_test>  slist;    for (int i=0;i<100000;i++)    {        Por_test s;        s.id = 1;        s.name = QString("hello World!");        s.sex = QString("男");        slist.append(s);    }    slist.clear();    return a.exec();}

            將上面代碼中的slist.clear(); 注釋掉,內存顯示為如下(任務管理器里的截圖)

            111

            如不去掉的話,內存顯示如下圖

            22222

            2.T的類型為指針的情況,這時候直接調用clear()方法將不能釋放,先看代碼

            #include <QtCore/QCoreApplication>#include <QList>#include <QString>int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    typedef struct _test    {        int id;        QString name;        QString sex;    }Por_test;    QList<Por_test *>  slist;    for (int i=0;i<100000;i++)    {        Por_test *s = new Por_test();        s->id = 1;        s->name = QString("hello World!");        s->sex = QString("男?");        slist.append(s);    }//    qDeleteAll(slist);    slist.clear();    return a.exec();}

             

            上面代碼運行后的內存情況如下圖

            3333

            說明當T的類型為指針時,調用clear()方法并不能釋放其內存

            此時void qDeleteAll ( const Container & c )方法將派上用場了,將上面代碼中的注釋去掉以后,

            再次運行程序,此時的內存情況如下圖

            4444

            通過對比靚圖,可以看出,內存已經釋放,我們再來看下qt助手中qDeleteAll 方法的說明

            void qDeleteAll ( ForwardIterator begin, ForwardIterator end )

            Deletes all the items in the range [beginend) using the C++ delete operator. The item type must be a pointer type (for example, QWidget *).

            Example:

             QList<Employee *> list; list.append(new Employee("Blackpool", "Stephen")); list.append(new Employee("Twist", "Oliver")); qDeleteAll(list.begin(), list.end()); list.clear();

            Notice that qDeleteAll() doesn't remove the items from the container; it merely calls delete on them. In the example above, we call clear() on the container to remove the items.

            This function can also be used to delete items stored in associative containers, such as QMap and QHash. Only the objects stored in each container will be deleted by this function; objects used as keys will not be deleted.

            See also forward iterators.

            void qDeleteAll ( const Container & c )

            This is an overloaded member function, provided for convenience.

            This is the same as qDeleteAll(c.begin(), c.end()).

             

            上面qDeleteAll 方法的說明,已經很清楚了,如果T為指針類型時,釋放內存須在clear方法前加上qDeleteAll 方法。

            国产一级做a爰片久久毛片| …久久精品99久久香蕉国产| 国产精品免费看久久久香蕉| 狠狠久久综合伊人不卡| 日本五月天婷久久网站| 漂亮人妻被黑人久久精品| 女人香蕉久久**毛片精品| 久久成人小视频| www.久久热| 无码日韩人妻精品久久蜜桃| 青青国产成人久久91网| 久久www免费人成看片| 精品免费久久久久国产一区| 99精品国产综合久久久久五月天| 久久r热这里有精品视频| 亚洲狠狠婷婷综合久久蜜芽| 久久久久一本毛久久久| 狠狠色婷婷综合天天久久丁香 | 久久精品国产精品亚洲精品| 国产精品美女久久久久| 久久人与动人物a级毛片| 国产午夜精品久久久久九九| 国产成人久久精品一区二区三区| 99久久国产综合精品女同图片| 久久精品亚洲乱码伦伦中文| 久久线看观看精品香蕉国产| 久久久久亚洲AV成人片 | 亚洲欧美国产精品专区久久| 久久97精品久久久久久久不卡| 欧美牲交A欧牲交aⅴ久久| 日韩人妻无码一区二区三区久久99| 色婷婷噜噜久久国产精品12p| 国产成人久久久精品二区三区| 久久精品国产半推半就| MM131亚洲国产美女久久| 亚洲av成人无码久久精品| 久久久一本精品99久久精品88| 少妇人妻综合久久中文字幕| 久久精品国产精品亚洲精品| 精品国产青草久久久久福利| 蜜臀av性久久久久蜜臀aⅴ麻豆|