1

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

什么是首选清理?

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

  • 通过“delete this”在 WM_DESTROY 中进行所有清理,强制 Window 由 new 分配。

4

1 回答 1

2

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

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

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

只是我的 2 美分。

于 2013-10-02T17:04:20.140 回答