如果对象将在消息处理程序中使用,如何解决内存泄漏问题?

时间:2016-01-08 11:03:06

标签: c++ winapi memory-management

PostMessage(
    hwnd,
    MSG_SYNCHRONIZE_EVENT, 
    eEvent_NewMessage,
    (LPARAM)new NewMessageEvent(...)
);

请注意上面的new NewMessageEvent行,我正在创建NewMessageEvent的新对象以发送给消息处理程序。

我确定,我在消息处理程序中为delete调用NewMessageEvent

问题是我的静态分析工具将其显示为内存泄漏。现在问题可能是在使用PostMessage时,我们不确定它是否会被处理。

解决此内存泄漏问题的方法应该是什么?

2 个答案:

答案 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,则需要一个互斥锁来正确处理它。