Winapi 无论关闭窗口的方法如何,是否始终发送WM_DESTROY?

Winapi 无论关闭窗口的方法如何,是否始终发送WM_DESTROY?,winapi,memory-leaks,event-driven,Winapi,Memory Leaks,Event Driven,我的程序中有一些大内存分配,在整个程序中我需要大部分内存。那么,删除此内存的最佳位置是什么?我真的不想就此罢休。。所以总是发送WM_DESTROY消息吗?我的意思是,即使我的申请被其他程序终止。。?如果没有,请指导删除内存的最佳位置。如果应用程序被终止(通过TerminateProcess),您的代码将无法运行,因此您的代码中几乎没有任何内容可以“清理”内存 如果应用程序只是在接收后退出,那么最终消息循环将退出,并且main(或WinMain)函数将返回-因此,应用程序范围的清理应该在main/

我的程序中有一些大内存分配,在整个程序中我需要大部分内存。那么,删除此内存的最佳位置是什么?我真的不想就此罢休。。所以总是发送
WM_DESTROY
消息吗?我的意思是,即使我的申请被其他程序终止。。?如果没有,请指导删除内存的最佳位置。

如果应用程序被终止(通过
TerminateProcess
),您的代码将无法运行,因此您的代码中几乎没有任何内容可以“清理”内存

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

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

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


换句话说,你试图做的最好描述为。你似乎相信有一种神奇的咒语,如果你这么做的话,它会以某种方式保护你远离“邪恶”。说咒语是一种幻想,是你想象的虚构。没有代码。

如果应用程序被终止,操作系统将释放您分配的所有内存,您对此无能为力:您既不能帮助它,也不能阻止它。如果应用程序被另一个进程终止,您无论如何也不能做任何事。除此之外,
WM_DESTROY
是一个进行清理的好地方。@KubaOber是的,它被释放了(虽然依赖于操作系统,但对Windows有效),但我认为自己释放它很好。因为我不想养成要求操作系统也这样做的习惯,如果养成了这个习惯,那么为嵌入式环境编码这是非常危险的“为嵌入式环境编码这是非常危险的”在嵌入式环境中,你要么有一个为你做这件事的操作系统,要么你不做动态内存分配(也不是解除分配)在系统初始化之后,可能根本没有
WM_DESTROY
的概念,也可能没有进程的概念(可能有任务)。你没有做任何“依赖操作系统”的事情,这是某种现代Windows,您不需要在进程退出时浪费时间释放内存。任何具有分页内存的合理操作系统都会在进程终止时释放进程内存。此外,这是毫无意义的-当进程被终止时,您根本无法执行任何代码。这就是终止进程的意思:您的代码停止执行剪切,你的进程就不复存在了。你对此无能为力,因为你不能运行任何代码。既然你不能运行任何代码,就没有理由担心事件传递——你的消息泵也不会运行。先生,谢谢你的回答。但是你对这件货物崇拜的疯狂想象是错误的。在维基上是这样的ays术语cargo cult程序员可能适用于非熟练或新手计算机程序员(或对手头的问题缺乏经验的程序员)从一个地方复制一些程序代码并粘贴到另一个地方,对代码的工作原理几乎不了解或根本不了解,也不知道它是否需要在新的位置上使用。这绝对不是事实。我不复制粘贴。我可以接受任何其他内容。但是回答时请注意你的话。@user2705939:我认为“货物崇拜”引用是指你试图实现的东西并没有真正达到目的,因为总有一种方法可以在不运行任何代码的情况下终止你的程序。我不认为这是一种侮辱——引用的是“编程”,而不是“程序员”.而且,为了避免误解:我确信我自己写了大量的cargo cult代码-我现在知道了,而不是当时。这似乎是人类的一个普遍缺陷。认识到自己的缺点并改进解决问题的方法才是真正重要的。@KubaOber,谢谢你!我几乎在6个月后登录,你的回答让我明白了对我来说有些道理。现在,我不在乎在我的应用程序即将终止时释放内存,除非它是一个共享资源。很抱歉误解了。