DirectX 6.1 SDK示例ddex1.cpp是否存在DirectDraw接口泄漏?
是否需要对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

