Andrej Karpathy的RSS订阅清单

← Andrej Karpathy的RSS订阅清单28 Sept · 7 min

程序不崩却持续占内存:最危险的默认值原来是0

程序不崩却持续占内存:最危险的默认值原来是028 Sept7 min

一次看似由 `RegisterDragDrop` 与 `RevokeDragDrop` 引发的内存泄漏,最终指向了更隐蔽的 Win32 生命周期错误:窗口过程把未处理消息直接返回了 `0`,而没有交给 `DefWindowProc`。程序没有崩溃,却悄悄阻断了系统完成最后清理的路径。

Raymond Chen 通过这个案例说明,API 调用成对出现,并不代表资源一定会立刻释放。理解窗口销毁、共享缓存与默认消息处理链,才能分辨“正常延迟清理”和真正的泄漏。

原文链接:

https://devblogs.microsoft.com/oldnewthing/20260924-00/?p=112728/

原文标题:No, really, you need to pass all unhandled messages to DefWindowProc, part 2

主要内容:

• `WM_DESTROY` 并非窗口生命周期的终点,后续消息仍承担系统级清理职责。

• 未处理消息必须转交 `DefWindowProc`;直接返回 `0` 等于错误地宣称消息已处理。

• `RevokeDragDrop` 会解除注册关系,但窗口级共享基础设施可能保留至窗口真正销毁时再清理。

• 应用状态被提前删除后,如果以“状态是否存在”决定是否转发消息,就可能吞掉关键清理消息。

• 资源问题往往不在分配与释放 API 本身,而在生命周期边界和消息分发协议上。

推荐理由: