• <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 點點滴滴 閱讀(2448) 評論(0)  編輯 收藏 引用 所屬分類: 02 編程語言

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

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

              

               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++ ,如果父親對象無效時,子對象自動釋放分配的內存。


            伊人久久大香线蕉AV一区二区| 日韩人妻无码一区二区三区久久| 色综合久久综合中文综合网| 一本大道久久香蕉成人网 | 国产精品免费久久| 99精品伊人久久久大香线蕉| 色综合合久久天天综合绕视看| 精品综合久久久久久97超人| AAA级久久久精品无码区| 久久99国产精品成人欧美| 久久久久久极精品久久久| 久久国产免费直播| 久久精品卫校国产小美女| 久久中文骚妇内射| 伊人久久综合热线大杳蕉下载| 久久久黄片| 伊人色综合九久久天天蜜桃 | 久久精品成人免费观看97| 久久久久一级精品亚洲国产成人综合AV区 | 99久久国产亚洲综合精品| 午夜不卡久久精品无码免费| 99久久无码一区人妻a黑| 久久国产一区二区| 欧美伊人久久大香线蕉综合69| 国产成人精品综合久久久久 | 亚洲AV伊人久久青青草原| 无码国内精品久久人妻| 久久亚洲国产中v天仙www| 午夜精品久久久久久影视riav| 久久久精品人妻一区二区三区四| 国产亚洲成人久久| 午夜久久久久久禁播电影| 久久不见久久见免费影院www日本| 2021国产精品久久精品| 亚洲欧美精品伊人久久| 国产美女亚洲精品久久久综合| 久久久久国产精品| 亚洲午夜久久久久妓女影院| 很黄很污的网站久久mimi色 | 亚洲国产成人久久综合一| 国产香蕉久久精品综合网|