如何处理Windows消息中动态分配数据的生命周期?

时间:2010-06-16 10:07:38

标签: windows memory-management windows-messages

简单任务:发送带有动态分配数据的Windows消息,例如任意长度的字符串。您如何管理释放此数据的责任?

Windows消息的接收者可能负责释放这些数据。但是:您如何保证实际接收所有消息,从而释放链接数据?想象一下接收器正在关闭的情况,因此它不再处理它的消息队列。但是,消息队列仍然存在(一段时间),仍然可以接受消息,不再处理消息。

谢谢!

2 个答案:

答案 0 :(得分:2)

PostMessage会返回BOOL,告诉您邮件是否已过帐。这通常足够好,因为在收到WM_DESTROYWM_NCDESTROY消息之前,您的窗口应该有效。在调用DestroyWindow(发送这些消息)之后,您应该无法再次成功调用PostMessage。

现在,如果您的PostMessage返回FALSE ,则必须清理。如果没有,则窗口过程必须清理。不要将必须清理的消息发送到可能无法处理它们的随机窗口。实际上,请不要将任何 WM_USER + x条消息发送到您未处理的任何窗口。

答案 1 :(得分:1)

这里没什么可做的。一旦调用SendMessage返回,您就可以释放数据。碰巧,其他应用程序无论如何都不会看你的记忆,因为它处于不同的过程中。相反,Windows会跨进程边界编组数据。

此外,如果您在WndProc中接收数据,则无法获取指向字符串的指针的副本。相反,您必须获取字符串内容的副本,因为该指针仅在调用WndProc的持续时间内有效。

要做的另一点是你对消息队列感到困惑。当您发送消息时,会同步发生并且不涉及队列。消息队列是放置发布消息的位置。它们是异步处理的。