• <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 - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            (搬運工)淺談QT的內存回收機制

            Posted on 2011-06-01 15:09 點點滴滴 閱讀(2460) 評論(0)  編輯 收藏 引用 所屬分類: 02 編程語言

            初學QT。我本人認為QT更是一種藝術的體現,而非簡單的當作一個物品開看待。體現了人類思想的偉大。就這點而言,中國人恰恰就缺少這種創建型藝術細胞?;蛘哒f是,國內缺少這種藝術創建的氛圍。

               以下文章均為閑聊。并無技術的嚴謹性。關于其中的內容,可能存在錯誤。請指正。

              

               C++, Pascal,語言要求必須明確內存的作用域,并且對創建的內存區域。由程序員刪除delete。雖然存在自動模式,但并不先進

               Java, SmallTalk,語言則可進行內存碎片的自動查找分析,動態的刪除無用內存區域。從而可以使程序員專注于程序邏輯的開發。而無須在即系統問題。

               對于內存的釋放存在3中方法:

                   1 - Let the creating object delete its child objects. 創建并刪除

                   2 - Let the last object to handle an object delete it.最后處理

                   3 - Don't care about memory and forget about it.      無須在意

               對于第三種方法,我們稱之為"bug"。將會造成內存的溢出。 對于程序員應該熟悉前2種方法。

               但QT則采用一種更高級的內存管理機制.

               1 - QPointer  可以監控空間的分配狀況。以下程序,請自行分析

                     QDate *mydate=new QDate(QDate::currentDate());
                     QPointer<QDate> mypointer=mydata;
                     mydate->year();    // -> 2005
                     mypointer->year(); // -> 2005

                    delete mydate;

                    if(mydate==0) printf("clean pointer");                       //mode 1
                    else printf("dangling pointer");
                    // -> "dangling pointer"

                    if(mypointer.isNull()) printf("clean pointer");             //mode 2
                    else printf("dangling pointer");
                    // -> clean pointer

               2 - 內存處理機制   QObjectCleanupHandler

                  姑且略過

               3 - 碎片處理

                   存在幾種簡單的碎片處理機制。

                   a.計數器模式類似于壓棧

                   b.父窗口的自動回收

                   c.自我的回收

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            下面才是最重要的(轉載)

             在棧上用new分配的內存,為什么沒有用delete釋放?

            從HelloQt說起

            #include <qapplication.h>
            #include 
            <qlabel.h>
            int main( int argc, char **argv ){
                QApplication app( argc, argv );   
                QLabel 
            *label=new QLabel(“Hello QT!”,0);
                app.setMainWidget( label );
                label
            ->show();
                
            return a.exec();
            }



            這里label是new出來的一個指針變量,也就是在棧上申請的內存,在C++語言里,明確過,在棧上分配的內存是必須認為的用delete釋放的,防止內存泄露。這里為什么沒有呢。后來看到有的QT程序也有明確使用delete釋放內存的。這里越發不解了。后來,查到原來是QT擴展了C++,如果指針對象有父對象時,可以不用顯式釋放內存。我們需要顯式釋放的是那些沒有父對象的孤立的指針。但上面這個例子并沒有繼承父對象,注意第二個指針,指向父對象的指針參數為0,即沒有父對象,但是setMainWidget把它設為了主窗口部件,它就和程序同步了,當程序退出的時候自動釋放,孩子對象的釋放也是如此,在QT中擴展了C++ ,如果父親對象無效時,子對象自動釋放分配的內存。


            国产成人久久精品区一区二区| 久久久WWW成人| 国产美女久久精品香蕉69| 97久久超碰成人精品网站| 婷婷久久综合九色综合98| 欧美亚洲另类久久综合婷婷| 一本一本久久A久久综合精品 | 国产精品久久久久一区二区三区| 999久久久国产精品| 色欲久久久天天天综合网| 久久99国产精品一区二区| 久久强奷乱码老熟女网站| 国产精品成人99久久久久| 国产高潮国产高潮久久久| 久久人人添人人爽添人人片牛牛| 国内精品久久久久久久久电影网| AV无码久久久久不卡蜜桃| 久久亚洲AV成人无码软件| 狠狠色综合久久久久尤物| AV无码久久久久不卡网站下载| 久久婷婷五月综合97色直播| 久久精品一区二区三区中文字幕| 亚洲精品tv久久久久久久久| 欧美午夜A∨大片久久| 久久99热这里只有精品国产| 狠狠色婷婷综合天天久久丁香| 亚洲欧美成人综合久久久| 久久亚洲AV无码精品色午夜 | 亚洲AV无码一区东京热久久| 青青热久久国产久精品 | 久久99国产综合精品女同| 亚洲国产精品一区二区久久hs| 亚洲国产成人乱码精品女人久久久不卡 | 久久人人爽人人爽人人片AV麻烦 | 国产成年无码久久久久毛片| 欧美黑人激情性久久| 蜜臀av性久久久久蜜臀aⅴ| 日韩久久久久久中文人妻| 国产精品久久久久影院嫩草| 国产一区二区精品久久| 国产亚洲色婷婷久久99精品91|