• <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 閱讀(3859) 評論(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 方法。

            久久国产精品一国产精品金尊| 日本久久中文字幕| 久久久九九有精品国产| 日本道色综合久久影院| 久久久精品视频免费观看| 97精品国产97久久久久久免费| 天堂久久天堂AV色综合| 国产精品激情综合久久| 久久亚洲国产精品成人AV秋霞 | 99久久综合国产精品二区| 久久精品九九亚洲精品天堂| 久久久久亚洲AV无码麻豆| 99久久国产综合精品麻豆| 无码精品久久一区二区三区 | 国产成人精品综合久久久久 | 99久久精品国产毛片| 婷婷伊人久久大香线蕉AV| 亚洲精品国产综合久久一线| 狠狠色丁香久久婷婷综| 精品多毛少妇人妻AV免费久久| 国产亚洲精久久久久久无码AV| 久久精品国产亚洲AV电影| 噜噜噜色噜噜噜久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久香蕉国产线看观看乱码| 久久久久亚洲精品日久生情| 午夜精品久久久久久| 91久久成人免费| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久久久成人精品无码中文字幕| 久久99九九国产免费看小说| 国产一区二区三精品久久久无广告| 久久精品亚洲日本波多野结衣 | 69SEX久久精品国产麻豆| 亚洲va中文字幕无码久久| 精品人妻伦九区久久AAA片69| 久久亚洲精品国产精品婷婷| 伊人久久大香线蕉AV一区二区 | 久久青青草视频| 亚洲伊人久久大香线蕉综合图片| 午夜欧美精品久久久久久久|