首页 > 解决方案 > 为堆栈和堆分配的窗口对象正确实现 CWindowImpl::OnFinalMessage

问题描述

ATLCWindowImpl有一个方便的可覆盖方法OnFinalMessage,当底层窗口被销毁时调用该方法。该文档特别允许在此方法中删除您的类对象:

的默认实现OnFinalMessage什么都不做,但您可以覆盖此函数以在销毁窗口之前进行清理。如果你想在窗口销毁时自动删除你的对象,你可以调用delete this;在这个函数中。

我的问题是:如果您希望您的CWindowImpl类在堆栈或堆上可用怎么办?据我了解,调用delete堆栈对象是不安全的,并且对象也没有可靠的方法来确定它的分配位置。是否有一些策略可以用来仅有delete this条件地调用?谢谢你的帮助。

标签: c++windowswinapiatl

解决方案


我有一个想法(但我还没有测试过)是这样的:

在标准CWindowImpl类中,不要调用delete. 在堆栈上使用此版本。

但是可能会设置一个像这样的混合类,当在堆上分配时可以动态使用它:

template <class T>
class CSelfCleaningWindow : public T
{
public:
    void OnFinalMessage(HWND hwnd)
    {
        __super::OnFinalMessage(hwnd);
        delete this;
    }
};

但我必须对此进行测试,看看它是否真的有效。


推荐阅读