PostMessage(
hwnd,
MSG_SYNCHRONIZE_EVENT,
eEvent_NewMessage,
(LPARAM)new NewMessageEvent(...)
);
请注意上面的new NewMessageEvent
行,我正在创建NewMessageEvent
的新对象以发送给消息处理程序。
我确定,我在消息处理程序中为delete
调用NewMessageEvent
。
问题是我的静态分析工具将其显示为内存泄漏。现在问题可能是在使用PostMessage
时,我们不确定它是否会被处理。
解决此内存泄漏问题的方法应该是什么?
答案 0 :(得分:2)
邮件的收件人必须删除该对象。您还需要处理对PostMessage
的调用失败的情况。代码运行如下:
NewMessageEvent* event = new NewMessageEvent(...);
if (!PostMessage(hwnd, MSG_SYNCHRONIZE_EVENT, eEvent_NewMessage, (LPARAM)event))
{
delete event;
// handle the error condition
}
然后在处理邮件的代码中,收件人,你这样做:
case MSG_SYNCHRONIZE_EVENT:
NewMessageEvent* event = (NewMessageEvent*)lParam;
// handle the event
delete event;
break;
假设您已完成所有这些操作,那么您就没有泄漏。静态分析工具无法确定销毁此对象的位置。您必须找到一种方法来告诉此工具忽略该特定分配。
答案 1 :(得分:0)
我通过在调用PostMessage之前在MessageEvent *
或std::set<MessageEvent *>
中放置set<shared_ptr<MessageEvent>>
对象来解决此问题。处理消息时,必须从集中删除它。
这种方法的主要优点是,如果没有处理消息(如果在关闭窗口时发布了常见事件),那么无论如何都可以销毁它(如果使用智能指针,实际上不需要任何操作)
缺点是如果从另一个线程调用PostMessage,则需要一个互斥锁来正确处理它。