对 JInput 中的内存泄漏进行故障排除:Windows 未被正确销毁

Troubleshooting Memory Leak in JInput: Windows Not Getting Destroyed Properly

提问人:Marko19907 提问时间:11/1/2023 更新时间:11/1/2023 访问量:87

问:

背景

我正在努力实现控制器热插拔,但遇到了内存泄漏。我在 Java 方面取得了一些进展,这记录在本 PR 中,但在原生 C 方面似乎存在一个挥之不去的问题,特别是在窗口创建和销毁方面。JInput

可以在此处找到该问题的完整背景。

问题描述

在库中,Windows 上的操纵杆输入涉及创建和销毁窗口。此过程由本机 C 代码处理,可在此处找到。 当我尝试使用 .即使在调用此函数后,隐藏的窗口仍会继续出现在 and 等工具中,并累积在内存中,从而导致资源泄漏。JInputDestroyWindowWinListerSpy++

我试过什么

  1. 我试图在销毁窗口之前处理它们的所有剩余消息。
  2. 我确保创建和销毁都由同一个线程执行。
  3. 我已经检查了 DestroyWindow 的返回值,并通过调用 GetLastError 验证它没有报告任何错误。

一个有趣的观察结果是,当我尝试使用相同的句柄再次调用 DestroyWindow 时,它返回错误代码 1400,指示句柄无效。

java c winapi 资源泄漏 jinput

评论

0赞 Simon Mourier 11/1/2023
DestroyWindow 将WM_DESTROY和WM_NCDESTROY消息发送到相关窗口。然后,窗口执行的操作取决于其代码。如果它没有被摧毁,这可能意味着它不想死,或者它没有(或不能)处理这些信息(“某人”必须泵送它们)。您知道/拥有此窗口和消息泵的代码吗?
0赞 Marko19907 11/1/2023
应该是原始代码中的相关部分。我在自己的分支中对此进行了轻微修改,以中断 with,以便我可以停止控制器轮询。JInputGetMessagePostMessage
0赞 Simon Mourier 11/1/2023
该代码在 Windows 术语中看起来很时髦:-)您应该有一个窗口过程,而不是直接使用 GetMessage 处理消息。它应该看起来像这样 learn.microsoft.com/en-us/windows/win32/api/winuser/...... learn.microsoft.com/en-us/windows/win32/winmsg/......
0赞 Marko19907 11/1/2023
谢谢,我会尝试像那样重新实现它
0赞 IInspectable 11/2/2023
另请参阅筛选窗口消息的危险

答: 暂无答案