我有一个基于对话框的MFC程序
问题代码如下//......
IXMLDOMDocumentPtr m_pDoc;
//......BOOL MyXMLDemoDlg::OnInitDialog()
{
    //........
    //初始化
    HRESULT hr = m_pDoc.CreateInstance(__uuidof(DOMDocument));
    if(FAILED(hr))
    {
        AfxMessageBox(_T("初始化XML组件时出错!"));
        OnCancel();
        return FALSE;
    }
    m_pDoc->Save(filename);
    //......
}void MyXMLDemoDlg::OnClose()
{
    if(m_pDoc != NULL)
    {
        m_pDoc->Release();//这里会出错,为什么,前面的代码一点问题没有。
        m_pDoc = NULL;
    }
}

解决方案 »

  1.   

    应该前面有 
    CoInitialize();后面有CoUninitialize();
      

  2.   

    恩,CoInitialize(NULL)不调用的话,m_pDoc所指向的内容为空。
    这时m_pDoc也许没问题,但m_pDoc->实际上是智能指针指向内容的->,所以会出错。所以判断的时候,不能用m_pDoc != NULL来判断。
      

  3.   


    错了。智能指针重载了 !操作符好像。查查msdn吧。
      

  4.   

    好象不需要调用智能指针的Release()?
      

  5.   

    这个我用调用,我google了一下,只能用.Release();而不能用->Release();
    但不知道什么原因。
      

  6.   

    .操作符表示对智能指针操作;
    ->操作符表示对智能指针所引用的指针操作。智能指针类重载了->操作符。
      

  7.   

    可以调用 
    m_pDoc.Release();
    或者
    m_pDoc = NULL; // 这句最保险不能调用
    m_pDoc->Release(); 这句会导致对象最终被多释放一次,最后一次对象已经不存在,所以出错。
      

  8.   

    智能指针应该调用.Release()而不是->Release()