我想与您分享我面临的这个问题。长话短说,我有这段小代码(仅用于测试目的):
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 anIUnknown
which internal count begins in 3?
pDoc
和 pUnk
本质上是访问单个对象的两种方式。由于它是单个对象,这反射(reflect)在引用计数中并解释了为什么它不从 1 开始。
但是根据该解释,您可能希望引用计数从 2 而不是 3 开始。它从 3 开始的事实可能是由 DOMDocument
用来处理 的内部帮助对象引起的code>IUnknown
接口(interface),内部帮助对象在其中维护一个额外的引用。
Why last
Release
method of theIUnknown
object isn't returning 0 as excepted?
同理:pDoc
和pUnk
本质上是同一个对象。由于此时您仍然有一个未发布的引用(可通过 pDoc
访问),该对象仍然存在。
关于c++ - COM+ 发布方法未降为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48915250/