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

时间:2013-10-02 16:56:16

标签: c++ winapi user-interface raii

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

什么是优先清理?

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

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

1 个答案:

答案 0 :(得分:2)

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

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

还有一种情况是您希望将窗口对象临时附加到“外部”HWND - 在这种情况下,您还需要解除对象和窗口的生命周期,因此第一种方法不能正常工作。 / p>

只是我的2美分。