GUI 和 RAII:通过析构函数或窗口关闭、窗口生命周期进行 Cleenup

GUI and RAII: Cleenup by destructor or window close, Window lifecycle

本文关键字:窗口 生命 周期 Cleenup GUI RAII 析构函数      更新时间:2023-10-16

假设我想围绕 Windows 窗口函数编写一个包装器。然后,我让 Window 构造函数创建一个窗口并关联一个内部窗口过程,该过程又调用虚拟函数。

什么是预先清理?

  • 在 RAII 之后,该类的析构函数应调用 DestroyWindow。然后WM_CLOSE需要 returen 0 并以某种方式向窗口发出超出范围的信号(通过使用不是 RAII 的管理器,是吗?

  • 通过"删除此"在WM_DESTROY中执行所有清理,强制由 new 分配窗口。

后一种方法(delete this(是有问题的,如果你有其他客户端引用它(他们现在留下了无效的指针(,它迫使你在堆上分配你的对象,并要求你引入某种引用计数。

RAII方法更明智。毕竟,让对象从屏幕上消失但仍处于活动状态(即窗口被隐藏(是可以的。我不明白为什么窗口本身的生命周期必须与对象的生命周期相关联。您不需要在构造函数中创建窗口,也不需要在析构函数中销毁它。通常,这是通过向构造函数提供一个标志来解决的,该标志控制是否将在构造函数中自动销毁真实窗口 - 有些场景需要其中一个。

还有一种情况是,您希望将窗口对象临时附加到"外部"HWND - 在这种情况下,您还需要分离对象和窗口的生存期,因此第一种方法效果不佳。

只是我的2美分。