在破坏CComPtr期间的异常

ana*_*and 5 com atl exception smart-pointers visual-c++

我有一个成员变量声明为

CComPtr<IXMLDOMDocument2> m_spXMLDoc;
Run Code Online (Sandbox Code Playgroud)

XML文档就是这样创建的

CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
    IID_IXMLDOMDocument2, (void**)&m_spXMLDoc));
Run Code Online (Sandbox Code Playgroud)

现在,当应用程序退出时,会抛出异常.Callstack指向p->Release()

~CComPtrBase() throw()
{
   if (p)
      p->Release();
}
Run Code Online (Sandbox Code Playgroud)

当我将鼠标悬停p在VS调试器中时,它指向一些有效的内存.

最后一个callstack指向msxm6中的异常

msxml6.dll!3d6cXX03() 
Run Code Online (Sandbox Code Playgroud)

有什么建议,可能是什么原因?我不认为这是一个CComPtr问题.

Jav*_*Man 6

我有一个类似的问题,最终我发现它只是一个错误.我必须确保CoUninitialize()CComPtr被破坏之后被称为.否则,会有例外.

int _tmain(int argc, _TCHAR* argv[]) {
  CoInitialize(NULL);
  mymain(); 
  //put all logic in a separate function so that CComPtr
  //is destructed before CoUninitialize()
  CoUninitialize();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

CComPt在与CoUninitialize()调用相同的函数中声明r 将导致异常,因为在函数终止后发生破坏.


Dan*_*Dan 0

您应该使用 CComPtr 的成员函数创建实例:

m_spXMLDoc.CoCreateInstance(...)
Run Code Online (Sandbox Code Playgroud)