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

            久久综合88熟人妻| 久久综合综合久久综合| 久久er国产精品免费观看8| 久久久久久久久久久久中文字幕| 看久久久久久a级毛片| 久久精品国产久精国产思思 | 久久免费视频网站| 久久精品国产一区二区| 中文无码久久精品| 91秦先生久久久久久久| 久久久久亚洲?V成人无码| 性欧美大战久久久久久久久| 久久综合丁香激情久久| 亚洲国产成人久久综合一区77 | 99久久婷婷国产一区二区| 久久成人小视频| 国产精品伊人久久伊人电影| 精品久久久中文字幕人妻| 国产精品免费久久久久电影网| 久久精品国产亚洲AV蜜臀色欲 | 色综合久久天天综线观看| 国内精品久久久人妻中文字幕| 蜜臀久久99精品久久久久久| 久久亚洲国产午夜精品理论片 | 狠狠精品久久久无码中文字幕| 亚洲人成伊人成综合网久久久| 欧美国产精品久久高清| 品成人欧美大片久久国产欧美...| 无码专区久久综合久中文字幕| 婷婷久久五月天| 久久婷婷五月综合97色直播| 国产精品亚洲美女久久久| 精品久久久久久综合日本| 国内精品久久久久伊人av| 国产精品国色综合久久| 无码精品久久久久久人妻中字 | 久久久噜噜噜久久中文字幕色伊伊| 国产精品久久永久免费| 狠狠狠色丁香婷婷综合久久五月| 精品久久久久久亚洲精品| 91久久精品91久久性色|