gpt4 book ai didi

com - IUnknown::QueryInterface() 是否增加引用计数?

转载 作者:行者123 更新时间:2023-12-04 10:29:15 34 4
gpt4 key购买 nike

如果我有 IUnknown *ptr , 我需要调用Release()在我通过ptr->QueryInterface()获得的每个界面上, 另外调用ptr->Release()当我完成 ptr ?

我曾经认为答案是"is",但是this quote from MSDN使我困惑:

Occasionally you may need to obtain a weak reference to an object (that is, you may wish to obtain a pointer to one of its interfaces without incrementing the reference count), but it is not acceptable to do this by calling QueryInterface followed by Release.



我不明白为什么会有问题——如果我调用 ptr->QueryInterface()然后调用 Release在结果指针上,对象上的引用计数不应该仍然是正数吗?这如何导致无效指针?

最佳答案

文档是正确的。并且您需要遵循引用计数规则 - 包括调用 Release在从 QueryInterface 获得的接口(interface)上除了在您创建对象之后。

澄清为什么你不能用 Release 做弱指针- 调用 QueryInterface 时存在竞争条件然后 Release之后立马。

  • Thread1 创建对象 - 引用计数 1
  • 线程 2 调用 QueryInterface对于弱引用 - 引用计数 2
  • Thread1 释放对象 - 引用计数 1
  • 线程 2 调用 Release对于弱引用 - 引用计数 0。对象被破坏。
  • Thread2 尝试使用对象 - 错误。

  • 警告是为了防范上述情况——大概有些程序员认为他们可以“调用 ptr->QueryInterface(),然后在结果指针上调用 Release”,然后使用对象......

    关于com - IUnknown::QueryInterface() 是否增加引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376286/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com