2012-09-04 26 views
1

我有一個遺留代碼。代碼的工作原理如下:在發生Event1之後,它會在堆中創建一個窗口對象(繼承自CWindowImpl類)。發生Event2後,它會應用窗口中所做的更改,通過調用DestroyWindow()來關閉它,並通過調用delete釋放堆中的內存。如何摧毀堆放在堆中的窗口是否正確?

此代碼有問題,因爲它會在處理此窗口的所有消息之前刪除窗口對象。如何確定何時可以安全地爲窗口對象調用delete

我發現的唯一解決方案是覆蓋OnFinalMessage並在那裏致電delete this。我不喜歡它,因爲它必須保證對象只在堆中創建。有更好的想法嗎?

謝謝。

回答

1

完成了DestroyWindow後,窗口的句柄被破壞了,因此在窗口類指針上使用delete是安全的。沒有遲到的消息可以到達那一點。

OnFinalMessage來自內部WTL的處理程序WM_NCDESTROY消息。