You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DirectX 6.1 SDK示例ddex1.cpp是否存在DirectDraw接口泄漏?

DirectDraw COM接口泄漏问题解答
  • 是否需要对DirectDrawCreate返回的IDirectDraw接口指针调用Release?
    按照COM的核心规则:每一次成功获取接口指针(不管是通过创建函数还是QueryInterface),都会增加对应COM对象的引用计数。DirectDrawCreate返回的pDD是一个引用计数为1的有效接口指针,因此必须调用Release()来平衡引用计数,这是必须遵守的要求。

  • 该示例代码是否存在此接口的泄漏?
    是的,存在泄漏。示例里只对g_pDD调用了Release(),但初始的pDD对应的引用计数从未被递减,程序退出时这个COM对象的资源无法被正确回收,属于典型的COM接口泄漏。

  • 是否应在InitApp中添加pDD->Release()来修复?
    完全应该。在通过QueryInterface成功获取到g_pDD之后,就不再需要pDD了,此时立即调用pDD->Release(),就能让COM对象的引用计数回到正确的平衡状态。比如在QueryInterface调用成功的代码块末尾添加这行即可。

  • 是否IDirectDraw接口会与IDirectDraw4关联,释放后者会自动释放前者?
    不会。IDirectDraw和IDirectDraw4是同一个COM对象的不同接口,调用QueryInterface获取新接口时,会把整个对象的引用计数加1。也就是说,pDD和g_pDD指向同一个对象,但各自持有一次引用。只释放g_pDD只会把引用计数减1,而pDD的引用还在,对象不会被销毁,必须手动调用pDD->Release()才能让引用计数归0,触发对象的销毁。

内容的提问来源于stack exchange,提问作者Mr.C64

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:42:33