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

标签 c++ winapi memory-management

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

请观察上面一行中的new NewMessageEvent,我正在创建NewMessageEvent的新对象以发送到消息处理程序。

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

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

我应该采取什么方法来解决这个内存泄漏问题。

最佳答案

消息的接收者必须删除该对象。您还需要处理调用 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;

假设您已完成所有这些操作,那么就不会发生泄漏。静态分析工具不可能找出该对象被破坏的位置。您必须找到一种方法来告诉该工具忽略该特定分配。

关于c++ - 如果在消息处理程序中使用对象,如何解决内存泄漏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34675483/

相关文章:

c++ - std::cspan 发生了什么?

c - 在 Visual Studio 中设置 FILE_ATTRIBUTE_DEVICE

memory-management - Cassandra是否使用Heap内存来存储blooms filter,100GB的数据需要占用多少空间?

c++ - 复制一个句柄然后关闭原来的句柄

multithreading - EndDialog 不能在线程中调用?

memory-management - 如何在 Lua 中成功使用 Loki 的小对象分配器?

c# - 确定在抛出 OutOfMemoryException 之前可以使用的可用内存

c++ - 制作分组框按钮 win32 C++

c++ - 将外部对象作为类成员的引用的优点/缺点?

c++ - 使用#define 创建指针