Com “是否有对应的名称?”;CreateInstance";?

Com “是否有对应的名称?”;CreateInstance";?,com,msxml,destruction,Com,Msxml,Destruction,我们有一些使用MSXML的代码,可以这样创建XML文档对象: MSXML2::IXMLDOMDocumentPtr doc_in; doc_in.CreateInstance("Msxml2.DOMDocument.6.0"); 一旦我们搞定了doc_in,我们怎么摧毁它?它只是在doc_in超出范围时自动销毁,还是什么?如果IXMLDOMDocumentPtr是一个智能指针(看起来像),那么它将负责为您调用doc_in.Release()。COM对象生命周期管理是通过s方法AddRef(

我们有一些使用MSXML的代码,可以这样创建XML文档对象:

MSXML2::IXMLDOMDocumentPtr  doc_in;

doc_in.CreateInstance("Msxml2.DOMDocument.6.0");

一旦我们搞定了doc_in,我们怎么摧毁它?它只是在doc_in超出范围时自动销毁,还是什么?

如果IXMLDOMDocumentPtr是一个智能指针(看起来像),那么它将负责为您调用doc_in.Release()。

COM对象生命周期管理是通过s方法
AddRef()
Release()
构建的。有关详细信息,请参见

除此之外,还使用了智能指针,最常见的是ATLs/and

因此,如果您处理的是指向COM实例的普通指针,则必须手动
Release()
以放弃所有权。

如果您有一个指向COM实例的智能指针,
Release()
应该在智能指针实例超出范围时为您执行-但请务必查看您正在使用的实际智能指针类的文档。

如果我使用的是
IXMLDOMDocument*
而不是
IXMLDOMDocumentPtr
,该怎么办?这意味着不同的答案吗?我正试着让我的头脑清醒过来…当然。在COM中,您负责跟踪COM接口的使用情况。为此,在接口指针上使用AddRef()和Release()调用。如果您使用的是“原始”指针,那么当您不再使用指针时,需要调用Release()(而不是为处理指向您的指针的人调用AddRef(),例如QueryInterface()。