為了引入WINX窗口類對象的內存管理(生命周期模型),我繞了一大圈子。實在是,內存 管理太重要了,花多少口舌介紹它都不過分。我曾經見到這樣一句話:"C++程序員覺得 內存管理太重要了,所以一定要自己進行管理;Java/C#程序員覺得內存管理太重要了,所以 一定不能自己去管理"。從某種意義上說,兩者都是對的。
那麼WINX的窗口對象是否也是采用gc allocator呢?
答:不是。
具體問題具體分析。在通常情況下,我個人確實已經非常習慣使用gc allocator來進行內 存管理,但是WINX窗口對象恰恰是個例外。為什麼?原因有二:
gc allocator比較適合作為完整應用的解決方案。但是winx只是界面庫,由於庫的特殊性 ,它的內存管理也存在一定的特殊性。盡管我喜歡gc allocator,但是我並不能假設所有 winx的用戶都喜歡gc allocator。
winx窗口對象有更加合適且極其簡單的內存管理模型。gc和gc allocator的觀念,最重要 的一點,是要在任意復雜的情形下,提供解決方案來減輕使用者的內存管理負擔,它們是從 更一般化的角度討論的方案。但其實聰明的開發人員早已經發明了一種簡單有效的手工內存 管理法則:基於Owner的內存管理模型。
這種基於Owner的內存管理模型觀念非常簡單:當一個對象(Child對象)被另一個對象( Owner對象)所擁有,意味著Child對象的生命周期不可能超過Owner對象。因此,Owner對象 在自身銷毀時,會負責將所有Child對象銷毀。
在界面編程中,窗口(指HWND所指代的系統資源)與窗口對象(指C++實現的窗口類實例 )的關系是奇妙的。從宏觀角度講,窗口與窗口對象的生命周期是應該是一樣的。但是既然 它們是兩個不同的實例,當然它們的銷毀仍然會有細節上的先後之分。在實際應用中,區分 為兩種完全不同的用況:
窗口在生成後new出窗口對象(時機一般選擇在WM_NCCREATE),並成為窗口對象的Owner 。這種用況只有winx支持。它的好處是:
窗口對象的生命周期非常清晰,用戶根本無需擔心可能發生內存洩漏問題。
支持可視化的自定義窗口的創建方式。詳細參考:《WINX如何做到可視化界面開發》: http://blog.csdn.net/xushiweizh/archive/2006/11/10/1378242.aspx。
窗口對象先於窗口生成,其生命周期完全脫離窗口的生命周期。這是多數界面庫的做法。 WINX也支持此用法,只要你的窗口類定義了WINX_STACK_OBJECT(TRUE)。它的好處是:
窗口對象可在構造時獲得初始化參數,而不需要用丑陋的CreateWindow/CreateWindowEx 的額外參數。
對於一個模態過程(例如對話框),窗口對象還可以記錄一些返回數據(退出狀態)。
如何選擇?
在WINX中,方式1.作為默認選擇,一般的窗體遵循此模式。而所有頂級窗體(如模態對話 框ModalDialog、主窗體MainFrame,MDIMainFrame等)則默認采用方式2.進行管理。我們把 這類窗體聲明為WINX_STACK_OBJECT,只是因為它們通常聲明為棧對象(StackObject),但 真實的含義是,窗口對象的生命期脫離窗口,完全由用戶自己負責。