【问题标题】:MSXML get_documentElement() & returning pointers to COM interfacesMSXML get_documentElement() & 返回指向 COM 接口的指针
【发布时间】:2012-01-24 05:47:48
【问题描述】:

我想知道在 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 series”的 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

【问题讨论】:

    标签: c++ com msxml


    【解决方案1】:

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

    关于谁(调用者或被调用者)负责在 COM 中执行有关引用计数和内存管理的操作的规则在 MSDN 上的 COM 文档中明确定义:

    The Rules of the Component Object Model

    Reference Counting Rules

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 2012-08-28
        • 2017-06-21
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多