我想知道在COM接口上调用Addref是否是COM库中的标准做法,该接口是从函数返回的。例如:
IXMLDOMElement* domElement = NULL;
document_->get_documentElement(&domElement); // does get_documentElement() call Addref on domElement?
// ...
// do something with domElement
// ..
domElement.Release(); // correct?
// (btw. member variable document_ is of type CComPtr<IXMLDOMDocument2>或者使用智能指针:
CComPtr<IXMLDOMElement> domElement;
document_->get_documentElement(&domElement);顺便说一句。我发现在"Windows media 9系列“的MSXML文档中,它说Addref叫做:http://msdn.microsoft.com/en-us/library/ms751196(v=vs.85).aspx
但在官方文档中没有提到它:http://msdn.microsoft.com/en-us/library/ms759095(v=vs.85).aspx
发布于 2012-01-21 07:28:42
是的,您应该在返回COM对象之前添加addref,因为调用方将有一个引用该对象的新接口指针,因此引用计数需要加1。这是规则,而不是例外。
但是,记录内部addref是一个例外,因为引用计数是COM的基本原理之一。文档可能是在此方法的许多调用者不知道规则并导致太多内存泄漏时编写的。
作为调用者,当你不再需要接收到的对象时,你需要直接或间接地调用Release (例如,通过类析构函数),并停止使用引用指针(许多人将指针设置为null以防止指针悬空)。
发布于 2012-01-21 11:04:18
返回接口指针的函数必须在退出前对其调用AddRef(),而不是接收对象的函数。接收接口指针的函数必须按原样使用它,然后对其调用Release()。这意味着get_documentElement()将调用AddRef(),所以不要自己调用它。
COM中关于引用计数和内存管理的规则-调用者或被调用者-在COM的MSDN文档中有明确的定义:
The Rules of the Component Object Model
Reference Counting Rules
https://stackoverflow.com/questions/8948551
复制相似问题