【发布时间】:2015-12-07 20:49:00
【问题描述】:
我有一个 Win32 MFC 应用程序,它创建了一个侦听 RS232 端口的线程。当接收到新数据时,侦听器线程使用new 分配内存并使用PostMessage 将消息发布到窗口。这进行得很好,窗口处理传入的数据并根据需要使用delete 删除内存。当我的程序关闭时,我注意到一些小的内存泄漏。我的怀疑是,在用户关闭程序并且线程在该内存被正确删除之前关闭时,正在发布一两条最终消息并且仍在消息队列中。有没有办法可以确保在程序关闭之前发生某些事情?我可以确保消息队列是空的,或者至少已经处理了其中一些重要消息吗?我试过在析构函数和类似的东西中查看WaitForInputIdle 或PeekMessage。关于解决这个问题的好方法有什么想法吗?
【问题讨论】:
-
你为什么在乎?应用程序正在关闭,一旦进程终止,操作系统将回收所有分配的内存。
-
除了在析构函数中释放资源外,不要做任何事情。你正在为自己招来很多痛苦。 (死锁和竞争条件很难解决)如果您需要确保消息传递,请使用
SendMessage -
太棒了!我喜欢听到我可以放手。但是我的印象是动态分配内存而不释放它是一种糟糕的形式。您提出了一个很好的观点,即操作系统在退出后会回收内存,但我只是认为,对于我所知道的每一次内存泄漏,可能还有其他一些我还不知道的可能导致更大的问题,或者这可能会使其他更严重bug 更难找到。我很惊讶你们很高兴我能不理会这件事。你能详细说明一下吗?
-
有点争议;一些程序员确实更喜欢在退出之前释放所有内容,这样如果他们有真正的内存泄漏,他们就可以分辨出来。另一方面,在某些情况下,它可能会导致非常缓慢的关机。在您的情况下,我认为跟踪这些内存分配是合理的 - 将它们放在链表或其他东西中 - 这样您就可以在退出时释放它们。