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

如何处理Windows消息中动态分配的数据的生命周期?,windows,memory-management,windows-messages,Windows,Memory Management,Windows Messages,简单任务:发送带有动态分配数据的windows消息,例如任意长度的字符串。您将如何管理释放此数据的责任 windows消息的接收者可能负责释放此数据。但是:您如何保证所有消息都将被实际接收,从而链接的数据将被释放?想象一下,接收器正在关闭,因此它将不再处理它的消息队列。但是,消息队列仍然存在(一段时间),并且仍然可以接受消息,这些消息将不再被处理 谢谢 这里没什么可做的。一旦对SendMessage的调用返回,您就可以释放数据。碰巧的是,另一个应用程序没有查看你的内存,因为它处于不同的进程中。相

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

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


谢谢

这里没什么可做的。一旦对SendMessage的调用返回,您就可以释放数据。碰巧的是,另一个应用程序没有查看你的内存,因为它处于不同的进程中。相反,Windows跨进程边界封送数据

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

另一点需要说明的是,您对消息队列感到困惑。当您发送消息时,这是同步发生的,不涉及队列。消息队列是放置已发布消息的位置。它们是异步处理的。

返回一个
BOOL
,告诉您消息是否已发布。这通常已经足够好了,因为您的窗口在收到
WM\u DESTROY
WM\u NCDESTROY
消息之前应该是有效的。调用(发送这些消息的)后,您应该无法再次成功调用PostMessage


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

对于赏金,假设消息是用PostMessage()发布的。我没有使用SendMessage,因为这会使问题变得很琐碎(也因为发布的是一个无法调用SendMessage的工作线程,因为它不拥有该窗口)。您是否可以编辑该问题,以便它实际询问您想要回答的问题。此外,在这种情况下调用SendMessage是完全安全的。@user9876您在谈论哪些消息?我有一种预感,带指针参数的消息是不允许发布的。如果您对此很担心,为什么不将指向数据的指针存储在某个容器中,并让接收者在处理完后回复您呢?当然,这有着相反的问题;如果接收器正在关闭且从未响应,则在关闭之前您不会释放内存(但至少不会泄漏内存)。假设我使用的是PostMessage(),而不是SendMessage()。此外,窗口处于同一进程中,但它属于不同的线程。