我有一个基于对话框的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;
}
}
问题代码如下//......
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;
}
}
CoInitialize();后面有CoUninitialize();
这时m_pDoc也许没问题,但m_pDoc->实际上是智能指针指向内容的->,所以会出错。所以判断的时候,不能用m_pDoc != NULL来判断。
错了。智能指针重载了 !操作符好像。查查msdn吧。
但不知道什么原因。
->操作符表示对智能指针所引用的指针操作。智能指针类重载了->操作符。
m_pDoc.Release();
或者
m_pDoc = NULL; // 这句最保险不能调用
m_pDoc->Release(); 这句会导致对象最终被多释放一次,最后一次对象已经不存在,所以出错。