首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSXML get_documentElement() &返回指向COM接口的指针

MSXML get_documentElement() &返回指向COM接口的指针
EN

Stack Overflow用户
提问于 2012-01-21 06:15:12
回答 2查看 869关注 0票数 0

我想知道在COM接口上调用Addref是否是COM库中的标准做法,该接口是从函数返回的。例如:

代码语言:javascript
复制
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>

或者使用智能指针:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2012-01-21 07:28:42

是的,您应该在返回COM对象之前添加addref,因为调用方将有一个引用该对象的新接口指针,因此引用计数需要加1。这是规则,而不是例外。

但是,记录内部addref是一个例外,因为引用计数是COM的基本原理之一。文档可能是在此方法的许多调用者不知道规则并导致太多内存泄漏时编写的。

作为调用者,当你不再需要接收到的对象时,你需要直接或间接地调用Release (例如,通过类析构函数),并停止使用引用指针(许多人将指针设置为null以防止指针悬空)。

票数 2
EN

Stack Overflow用户

发布于 2012-01-21 11:04:18

返回接口指针的函数必须在退出前对其调用AddRef(),而不是接收对象的函数。接收接口指针的函数必须按原样使用它,然后对其调用Release()。这意味着get_documentElement()将调用AddRef(),所以不要自己调用它。

COM中关于引用计数和内存管理的规则-调用者或被调用者-在COM的MSDN文档中有明确的定义:

The Rules of the Component Object Model

Reference Counting Rules

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8948551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档