| 模型 | 擁有者 | 建立時機 | 銷毀責任 | 適用場景 |
|---|---|---|---|---|
| 模型 1 (預設) | 視窗 (HWND) | WM_NCCREATE 時 new | 視窗銷毀時自動 delete | 一般視窗、可視化設計支援 |
| 模型 2 (棧物件) | 使用者程式碼 | 使用者自行建構 | 使用者負責 (通常為棧變數) | 模態對話框、主視窗、需建構參數/回傳值 |
當物件 A (Child) 被物件 B (Owner) 擁有 → A 的生命週期不超過 B。B 銷毀時負責銷毀所有 Child。
WINX 中:
WM_NCDESTROY 觸發刪除。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。兩種模型分別對應「視窗為主」與「使用者為主」的生命週期語義,零開銷、無競態、支援可視化設計與模態回傳值,是介面庫記憶體管理的最佳實踐。