如何正确销毁放置在堆中的窗口

How to destroy a window placed in the heap correctly?

本文关键字:窗口 何正确      更新时间:2023-10-16

我有一个遗留代码。代码的工作方式如下:发生Event1之后,它会在堆中创建一个窗口对象(继承自CWindowImpl类)。Event2发生后,它应用窗口中所做的更改,通过调用DestroyWindow()关闭它,并通过调用delete释放堆中的内存。

此代码有缺陷,因为它在处理此窗口的所有消息之前删除了窗口对象。如何确定何时可以安全地调用窗口对象的delete

我找到的唯一解决方案是覆盖OnFinalMessage并在那里调用delete this。我不喜欢它,因为必须保证对象只在堆中创建。有更好的想法吗?

谢谢。

完成DestroyWindow后,窗口的句柄已被销毁,因此在窗口类指针上使用delete是安全的。此时没有延迟的消息可以到达。

OnFinalMessage来自内部WTL的WM_NCDESTROY消息处理程序。