首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

WINX 視窗類物件記憶體管理:基於 Owner 的生命週期模型

     編輯:關於C++

兩種視窗物件擁有權模型

模型擁有者建立時機銷毀責任適用場景
模型 1 (預設)視窗 (HWND)WM_NCCREATE 時 new視窗銷毀時自動 delete一般視窗、可視化設計支援
模型 2 (棧物件)使用者程式碼使用者自行建構使用者負責 (通常為棧變數)模態對話框、主視窗、需建構參數/回傳值

為何不採用 GC Allocator?

  • WINX 是**介面庫**,不能假設使用者偏好 GC。
  • 視窗物件有**更簡單、更貼切**的 Owner 模型:生命週期天然綁定 HWND 或使用者作用域。
  • GC 適用於「任意複雜物件圖」,視窗物件屬於「明確樹狀擁有關係」,Owner 模型零開銷、零延遲、確定性釋放。

Owner 模型核心法則

當物件 A (Child) 被物件 B (Owner) 擁有 → A 的生命週期不超過 B。B 銷毀時負責銷毀所有 Child。

WINX 中:

  • 模型 1:HWND 為 Owner,視窗類物件為 Child。WM_NCDESTROY 觸發刪除。
  • 模型 2:使用者程式碼 (函式作用域/成員變數) 為 Owner。棧展開自動銷毀。

預設選擇規則

  • 一般視窗、子視窗、控制項 → **模型 1** (預設),配合可視化設計器。
  • 頂層視窗:ModalDialog, MainFrame, MDIMainFrame → **模型 2**,聲明 WINX_STACK_OBJECT(TRUE)。

程式碼片段

// 模型 1:視窗擁有物件
class MyWindow : public Window {
    // 無需 WINX_STACK_OBJECT
    BEGIN_MSG_MAP()
        MSG_WM_NCCREATE(OnNcCreate)
    END_MSG_MAP()
    BOOL OnNcCreate(LPCREATESTRUCT) {
        // 此處 this 已由框架 new 並關聯 HWND
        return TRUE;
    }
};

// 模型 2:使用者擁有物件 (棧上)
class MyDialog : public ModalDialog {
    WINX_STACK_OBJECT(TRUE) // 關鍵標記
public:
    MyDialog(int param) : m_param(param) {} // 可帶參數建構
    int GetResult() const { return m_result; }
private:
    int m_param, m_result;
};

// 使用
void ShowDialog() {
    MyDialog dlg(42); // 棧上建構
    dlg.DoModal();    // 模態運行
    int result = dlg.GetResult(); // 取回結果
} // dlg 自動銷毀

總結

WINX 採用 **Owner-based 確定性記憶體管理**,而非 GC。兩種模型分別對應「視窗為主」與「使用者為主」的生命週期語義,零開銷、無競態、支援可視化設計與模態回傳值,是介面庫記憶體管理的最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved