• <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 方法。

            国产成人精品久久一区二区三区 | 99热成人精品热久久669| 亚洲国产一成久久精品国产成人综合| 久久久久国产| 伊人久久精品无码av一区| avtt天堂网久久精品| 午夜福利91久久福利| 久久精品国产亚洲av水果派| 久久精品国产色蜜蜜麻豆 | 无码人妻少妇久久中文字幕蜜桃| 国产国产成人精品久久| 无码任你躁久久久久久| 99久久无色码中文字幕| 久久亚洲AV成人无码| 精品无码久久久久久久久久| 国产精品乱码久久久久久软件| 久久99国内精品自在现线| 91精品国产91久久久久久青草| 亚洲第一极品精品无码久久| 国产亚洲色婷婷久久99精品91| 日韩人妻无码精品久久久不卡| 综合久久精品色| 99精品伊人久久久大香线蕉| 久久影院综合精品| 久久国产欧美日韩精品| 亚洲午夜精品久久久久久浪潮| 狠狠精品干练久久久无码中文字幕 | 久久AⅤ人妻少妇嫩草影院| 性色欲网站人妻丰满中文久久不卡| 久久亚洲精品无码播放| 久久99国产精品久久久| 国产精品久久久久天天影视| 中文无码久久精品| 国产香蕉久久精品综合网| 日本精品久久久久影院日本| 久久艹国产| 欧美与黑人午夜性猛交久久久| 久久这里有精品视频| 一级a性色生活片久久无| 日韩欧美亚洲综合久久| 久久久久久久波多野结衣高潮|