• <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| 久久免费精品视频| 久久精品免费一区二区| 夜夜亚洲天天久久| 色欲久久久天天天综合网精品| 亚洲一区中文字幕久久| 国产成人精品综合久久久| 精品多毛少妇人妻AV免费久久| 亚洲精品乱码久久久久久按摩 | 亚洲成人精品久久| 7777精品久久久大香线蕉| 国产精品热久久无码av| 亚洲中文久久精品无码| 狠狠色丁香婷婷久久综合五月| 久久精品国产免费| 久久久亚洲欧洲日产国码二区| 四虎国产精品成人免费久久| 国产福利电影一区二区三区,免费久久久久久久精| 亚洲伊人久久成综合人影院| 久久激情五月丁香伊人| 久久久久久免费一区二区三区| 久久国产精品无码一区二区三区 | 久久发布国产伦子伦精品| 超级97碰碰碰碰久久久久最新| 成人精品一区二区久久久| 久久精品www| 国产ww久久久久久久久久| 91精品国产高清久久久久久国产嫩草| 久久精品无码一区二区无码| 亚洲国产另类久久久精品黑人| 久久久无码精品亚洲日韩京东传媒| 一本一本久久a久久精品综合麻豆| 久久天天躁狠狠躁夜夜2020| 色偷偷91久久综合噜噜噜噜| 亚洲中文字幕伊人久久无码 |