用户界面对象的线程亲缘性第五篇: 对象清理
作为一项基本原则,当一个进程退出的时候,窗口管理器和 GDI 对象会自动释放掉此进程中已创建的底层对象。(另外,窗口管理器在窗口所属线程退出的时候,也会听同时销毁窗口。)
请注意,这只是一个”兜底”机制,不应该成为资源泄露的借口,不应该觉着:”泄露点资源没事的,反正窗口管理器最终会帮我释放所有资源”,因为它是最后一道防线,我们不应该将它视作主要的资源保护手段。
首先,资源泄露了但不主动去处理,这个决定是草率的。这通常表明你的程序没有有效地跟踪自己分配的资源,并将其留给最后那道防线。这就好比,一个孩子将他的衣服扔在地板上,因为他知道他的母亲最终会过来捡起它并把它收起来。
另一方面,此清理发生在窗口管理器内部,在清理完成之前不会发生其他窗口管理器活动。如果你泄漏了数百或数千个对象,系统在视觉上似乎没有响应,因为窗口管理器正忙。(不过,系统仍在运行。不依赖于用户界面的操作(如计算密集型操作或网络活动)在窗口管理器清理时仍将正常进行。
为什么窗口管理器没有优化“大规模清理”方案?因为当你设计一个系统时,你专注于优化人们以负责任的方式使用你的系统的情况。你不想奖励那些虐待你的人。想象一下,如果你设计了系统,让滥用系统的人比遵守规则的人获得更好的性能,这会发出什么信息呢?
总结
资源泄露问题,尤其是内存和 GDI 资源的泄露,是我在开发 拓扑梅尔智慧办公平台 (Topomel Box) 一直都在关注的主题,我不希望走的太快,更愿意慢慢打磨。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Thread affinity of user interface objects, part 5: Object clean-up》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: COM接口规则的存在是有原因的
- 上一篇: 用户界面对象的线程亲缘性第四篇: GDI 对象及其他
相关推荐
- 实战经验:获取中文的拼音表示
- Posted on 09月30日
- 面向C++模块的开源 IFC SDK
- Posted on 10月14日
- 实现多次鼠标点击
- Posted on 12月01日
- 通过AddressSanitizer来发现实际产品的Bug
- Posted on 04月10日
评论已关闭。