• <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>
            隨筆-60  評論-111  文章-0  trackbacks-0

            一個類實例的生成需要經過對象內存分配、內存初始化、設置對象執行框架三個步驟。

            編譯器首先調用System._ClassCreate進行對象內存分配、內存初始化的工作。而System._ClassCreate調用TObject類的虛方法NewInstance建立對象的實例空間,繼承類通常不需要重載TObject.NewInstance,除非你使用自己的內存管理器,因此缺省是調用TObject.NewInstanceTObject.NewInstance方法將根據編譯器在類信息數據中初始化的對象實例尺寸(TObject.InstanceSize),調用系統缺省的MemoryManager.GetMem過程為該對象在堆(Heap)中分配內存,然后調用TObject.InitInstance方法將分配的空間初始化。InitInstance方法首先將對象空間的頭4個字節初始化為指向對象類的VMT的指針,然后將其余的空間清零。如果類中還設計了接口,它還要初始化接口表格(Interface Table)。

            當對象實例在內存中分配且初始化后,開始設置執行框架。所謂設置執行框架就是執行你在Create方法里真正寫的代碼。設置執行框架的規矩是先設置基類的框架,然后再設置繼承類的,通常用Inherited關鍵字來實現。

            上述工作都做完后,編譯器還要調用System._AfterConstruction讓你有最后一次機會進行一些事務的處理工作。System._AfterConstruction是調用虛方法AfterConstruction實現的。在TObjectAfterConstruction中只是個Place Holder,你很少需要重載這個方法,重載這個方法通常只是為了與C++ Builder對象模型兼容。

            最后,編譯器返回對象實例數據的地址指針。

            對象釋放服務其實就是對象創建服務的逆過程,可以認為對象釋放服務就是回收對象在創建過程中分配的資源。

            當編譯器遇到destructor關鍵字通常會這樣編碼:首先調用System._BeforeDestruction,而System._BeforeDestruction繼而調用虛方法BeforeDestruction,在TObjectBeforeDestruction中只是個Place Holder,你很少需要重載這個方法,重載這個方法通常只是為了與C++ Builder對象模型兼容。

            這之后,編譯器調用你在Destroy中真正寫的代碼,如果當前你在撰寫的類是繼承鏈上的一員,不要忘記通過inherited調用父類的析構函數以釋放父類分配的資源,但規矩是,先釋放當前類的資源,然后再調用父類的,這和對象創建服務中設置對象執行框架的順序恰好相反。

            當前類及繼承鏈中所有類中分配的資源全部釋放后,最后執行的就是釋放掉對象本身及一些特別數據類型占用的內存空間。編譯器調用System._ClassDestroy來完成這件工作。System._ClassDestroy繼而調用虛方法FreeInstance,繼承類通常不需要重載TObject.FreeInstance,除非你使用自己的內存管理器,因此缺省是調用TObject.FreeInstanceTObject.FreeInstance繼而調用TObject.CleanupInstance完成對于字符串數組、寬字符串數組、Variant、未定義類型數組、記錄、接口和動態數組這些特別數據類型占用資源的釋放[4],最后TObject.FreeInstance調用MemoryManager.FreeMem釋放對象本身占用的內存空間。

            很有意思的是,對象釋放服務與對象創建服務所用方法、函數是一一對應的,是不是有一種很整齊的感覺?

            對象創建服務

            對象釋放服務

            System._ClassCreate

            System._ClassDestroy

            System._AfterConstruction

            System._BeforeDestruction

            TObject.AfterConstruction(virtual)

            TObject.BeforeDestruction(virtual)

            TObject.NewInstance(virtual)

            TObject.FreeInstance(virtual)

            TObject.InitInstance

            TObject.CleanupInstance

            MemoryManager.GetMem

            MemoryManager.FreeMem

            還有一點要注意,通常我們不會直接調用 Destroy 來釋放對象,而是調用 TObject.Free,它會在釋放對象之前檢查對象引用是否為 nil

            posted on 2011-02-06 11:36 shaker(太子) 閱讀(2183) 評論(0)  編輯 收藏 引用
            久久综合色老色| 久久亚洲国产午夜精品理论片| 国产精品成人无码久久久久久| 18岁日韩内射颜射午夜久久成人| 久久国产乱子伦精品免费午夜| 2022年国产精品久久久久| 香蕉久久av一区二区三区 | 久久久久久久免费视频| 久久激情亚洲精品无码?V| 久久影院午夜理论片无码| 欧美亚洲国产精品久久久久| 欧美精品九九99久久在观看| 欧美伊人久久大香线蕉综合| 久久伊人精品一区二区三区| 中文字幕久久亚洲一区| 伊人久久综合精品无码AV专区 | 久久精品国产91久久麻豆自制| 久久国产亚洲高清观看| 狠狠色丁香婷综合久久| 久久国产精品免费| 国产69精品久久久久APP下载| 亚洲精品乱码久久久久久蜜桃不卡| 久久A级毛片免费观看| 欧美精品一区二区精品久久| 久久精品无码专区免费| 久久人妻AV中文字幕| 久久偷看各类wc女厕嘘嘘| 青青草原综合久久大伊人精品| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 思思久久99热只有频精品66| 久久免费的精品国产V∧| 国产精品99久久久久久www| 精品一二三区久久aaa片| 国产精品久久影院| 久久无码AV一区二区三区| 久久精品亚洲日本波多野结衣| segui久久国产精品| 久久99这里只有精品国产| 久久久精品2019免费观看| 国产91久久精品一区二区| 久久人妻少妇嫩草AV蜜桃|