c++ - COM+ 发布方法未降为 0

标签 c++ winapi win32com com+

我想与您分享我面临的这个问题。长话短说,我有这段小代码(仅用于测试目的):

    int main ()
    {
        IXMLDOMDocument *pDoc(nullptr);
        CoCreateInstance(CLSID_DOMDocument, nullptr, CLSCTX_ALL, IID_IXMLDOMDocument, reinterpret_cast<LPVOID*>(&pDoc));
        DWORD d = pDoc->AddRef();
        std::cout << "pDoc: add ptr=" << pDoc << " d=" << d << std::endl;
        d = pDoc->Release();
        std::cout << "pDoc: rel ptr=" << pDoc << " d=" << d << std::endl;

        IUnknown *pUnk(nullptr);
        pDoc->QueryInterface(IID_IUnknown, reinterpret_cast<LPVOID*>(&pUnk));
        d = pUnk->AddRef();
        std::cout << "pUnk: add ptr=" << pUnk << " d=" << d << std::endl;
        d = pUnk->Release();
        std::cout << "pUnk: rel ptr=" << pUnk << " d=" << d << std::endl;

        /*Release objects*/
        d = pUnk->Release();
        std::cout << "pUnk: rel ptr=" << pUnk << " d=" << d << std::endl;
        d = pDoc->Release();
        std::cout << "pDoc: rel ptr=" << pDoc << " d=" << d << std::endl;

        return 0;
    }

我期望最后 2 个 cout 打印 0 作为返回计数,在我看到的位置:

pDoc: add ptr=004A4628 d=2
pDoc: rel ptr=004A4628 d=1
pUnk: add ptr=004A3A10 d=4
pUnk: rel ptr=004A3A10 d=3
pUnk: rel ptr=004A3A10 d=2
pDoc: rel ptr=004A4628 d=0

为什么 QueryInterface 返回一个内部计数从 3 开始的 IUnknown? 为什么 IUnknown 对象的最后一个 Release 方法没有返回 0

我可能遗漏了什么?

最佳答案

Why QueryInterface returned me an IUnknown which internal count begins in 3?

pDocpUnk 本质上是访问单个对象的两种方式。由于它是单个对象,这反射(reflect)在引用计数中并解释了为什么它不从 1 开始。

但是根据该解释,您可能希望引用计数从 2 而不是 3 开始。它从 3 开始的事实可能是由 DOMDocument 用来处理 的内部帮助对象引起的code>IUnknown 接口(interface),内部帮助对象在其中维护一个额外的引用。

Why last Release method of the IUnknown object isn't returning 0 as excepted?

同理:pDocpUnk 本质上是同一个对象。由于此时您仍然有一个未发布的引用(可通过 pDoc 访问),该对象仍然存在。

关于c++ - COM+ 发布方法未降为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48915250/

相关文章:

c++ - 如何使用 Unicode 集将 std::string 传递给 CreateDirectory

c++ - 在 C++ 中反序列化对象

c++ - GDI 无法转换为具有精确调色板的索引颜色?

python - 用于 python 脚本的 iTunes API

c++ - -Wtype-limits 尝试限制无符号整数

c++ - 稍后在 C++ 中实现通用方法

c++ - 什么会导致单写/多读锁的死锁?

user-interface - 如何在 Windows GUI 中绘制垂直文本?

python - 使用 Python win32com 将整个 Excel 工作表复制到新工作表

python - 在 Windows 中请求管理员访问 Python 函数