【问题标题】:Is WM_DESTROY always sent irrespective of method of closing the window?无论关闭窗口的方法如何,是否总是发送 WM_DESTROY?
【发布时间】:2014-04-02 04:09:37
【问题描述】:

我的程序中有一些大的内存分配,我在整个程序中都需要它。那么删除这段记忆的最佳位置是什么?我真的不想让它一个人呆着..WM_DESTROY 消息总是发送吗?我的意思是即使我的应用程序被其他进程杀死..?如果不是,请指导哪个是删除内存的最佳位置。

【问题讨论】:

  • 如果您的应用程序被杀死,您分配的所有内存都将被操作系统释放,您对此无能为力:您既不能帮助它,也不能阻止它。
  • 如果你的应用程序被另一个进程杀死了,你无论如何也不能做任何事情。除此之外,WM_DESTROY 是进行清理的好地方。
  • @KubaOber 是的,它无论如何都被释放了(虽然依赖于操作系统,但对 Windows 有效),但我认为自己释放它很好。因为如果养成这种习惯,我不想养成要求操作系统也这样做的习惯,而在为嵌入式环境编码时这是非常危险的
  • "在为嵌入式环境编码时,这是非常危险的" 在嵌入式环境中,你要么有一个操作系统为你做这件事,要么你在系统之后不做动态内存分配(也不释放)根本没有初始化,而且可能没有WM_DESTROY 的概念,也可能没有进程的概念(也许有任务)。你没有做任何“依赖于操作系统”的事情,这是某种现代 Windows,你不需要浪费时间在进程退出时释放内存。任何具有分页内存的合理操作系统都会在进程终止时释放进程内存。
  • 此外,这都是 moot - 当您的进程被 杀死 时,您根本无法执行任何代码。这就是杀死进程的意思:你的代码停止执行,你的进程不复存在。您对此无能为力,因为您无法运行任何代码。由于您无法运行任何代码,因此甚至没有理由担心事件传递 - 您的消息泵也不会运行。

标签: winapi memory-leaks event-driven


【解决方案1】:

如果应用程序被终止(通过TerminateProcess),您的代码将无法运行,因此您实际上无法在代码中添加任何内容来“清理”事物。

如果应用程序在收到WM_QUIT 后只是退出,那么最终消息循环将退出并且main(或WinMain)函数将返回 - 因此您的应用程序范围的清理应该在@ 的末尾987654328@/WinMain,只要main/WinMain 中的代码体没有过早地显式返回。为了确保这一点,您可以将WinMain(或main)的主体移动到一个单独的函数中,并从实际的主函数中调用它,然后进行清理,最后返回。

您是正确的,应该在收到 WM_DESTROY 后进行每个窗口的清理,但这只会发生在窗口或应用程序完全关闭/退出而不是终止的情况下。

您也可以使用unhandled exception filter,但这是有问题的,因为无法保证不会由于内存损坏而引发未处理的异常。当内存已经损坏时,“释放”内存毫无意义,例如,您可能会陷入无限循环。

换句话说,您尝试做的最好描述为Cargo Cult Programming。你似乎相信有一些魔法咒语,如果你这样做,就会以某种方式保护你免受“邪恶”的伤害。所说的咒语是一种幻想,是你想象的虚构。没有代码。

【讨论】:

  • 先生,谢谢您的回答。但是你对这种货物崇拜的疯狂想象是错误的。在 wiki 上它说 当一个不熟练或新手计算机程序员(或对手头的问题没有经验的人)从一个地方复制一些程序代码并将其粘贴到另一个地方时,可能会适用术语货物崇拜程序员,几乎没有或根本不了解代码是如何工作的,或者它是否需要在它的新位置 这绝对不是这种情况。我不复制粘贴。我可以接受其他任何内容..但请在回答时注意你的话。
  • @user2705939:我认为“Cargo Cult”引用与您试图实现的东西并没有真正服务于目的的事实有关,因为总会有一种方法可以终止您的程序不再运行任何代码。我不认为这是一种侮辱——这里指的是“编程”,而不是“程序员”。
  • 而且,以免造成误解:我确信我自己编写了很多货物崇拜代码 - 我现在知道,当时不知道。看来,这是人类普遍的缺陷。认识到自己的缺点并改进自己解决问题的方法才是真正重要的。
  • @KubaOber,谢谢!我几乎在 6 个月后登录,您的回答对我来说很有意义。这些天来,我不在乎在我的应用程序将要终止时释放内存,除非它是共享资源。很抱歉造成误解。
猜你喜欢
  • 2017-01-08
  • 2011-06-04
  • 2010-09-27
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2016-05-02
  • 2014-10-23
相关资源
最近更新 更多