c++ - 为堆栈和堆分配的窗口对象正确实现 CWindowImpl::OnFinalMessage
问题描述
ATLCWindowImpl
有一个方便的可覆盖方法OnFinalMessage
,当底层窗口被销毁时调用该方法。该文档特别允许在此方法中删除您的类对象:
的默认实现
OnFinalMessage
什么都不做,但您可以覆盖此函数以在销毁窗口之前进行清理。如果你想在窗口销毁时自动删除你的对象,你可以调用delete this;在这个函数中。
我的问题是:如果您希望您的CWindowImpl
类在堆栈或堆上可用怎么办?据我了解,调用delete
堆栈对象是不安全的,并且对象也没有可靠的方法来确定它的分配位置。是否有一些策略可以用来仅有delete this
条件地调用?谢谢你的帮助。
解决方案
我有一个想法(但我还没有测试过)是这样的:
在标准CWindowImpl
类中,不要调用delete
. 在堆栈上使用此版本。
但是可能会设置一个像这样的混合类,当在堆上分配时可以动态使用它:
template <class T>
class CSelfCleaningWindow : public T
{
public:
void OnFinalMessage(HWND hwnd)
{
__super::OnFinalMessage(hwnd);
delete this;
}
};
但我必须对此进行测试,看看它是否真的有效。
推荐阅读
- python - 使用 pytesseract 从类型为“PIL.PpmImagePlugin.PpmImageFile”的图像中提取文本时出错
- sql-server - 未找到 ODBC 驱动程序管理器数据源名称且未指定默认驱动程序
- excel - 在字符串中的“/”之后的单个数字字符串上添加零
- jenkins - Selenide / Jenkins:java.lang.IllegalStateException:没有 webdriver 绑定到当前线程:
- c++ - 当所有内容都在一个文件中时,为什么会出现链接器错误?
- android - 如何检测密钥是否在 TEE 或钛芯片内部生成
- rust - 内置测试器“定义”没有像我预期的那样工作
- haskell - 如何建立对 Servant 类型错误的直觉?
- oracle - 如何使用 Oracle XML DB Webservices 将表作为一行返回
- android - 从服务器获取数据后如何缓存数据?