dzsj1209 2015-05-16 10:01 采纳率: 25%
浏览 1948

C++用智能指针循环打开XML文件时指针释放时出错

小弟在VS2012中用C++编一个打开XML的程序中遇到了些问题。我打开XML的方法是通过打开一个索引XML文件(Index)然后获得子XML文件的路径,然后在根据这些路径用循环的方式打开子XML文件获取里面的信息。但是,我的程序不知道为什么出错,当子XML是只有一个时,程序就可以正常运行,当子XML是多个的时候,程序就提升出错,有数据中断。我设了断点查看错误原因,具体是在读完子XML,并进行完xmlfile.UnLoadXML()后,在退出循环的大括号时,自动跳到了comip.h下的

 void _ Release() throw()
{
    if(m_pInterface != NULL) {
        m_pInterface->Release();
    }
}

中断发生后,调用堆栈提示是 xmlIndex.exe!_com_ptr_t < com_IIID< MSXML2::IXMLDOMNode , &_GUID_2933bf80 > 处发生了中断。
我自己查了下资料,好像是com智能指针的释放出了问题,但是苦思几天还是没能找到解决方法,求大神们解救。

PS:我在使用CFileDlg弹出一个可以选择路径的对话框来选择IndexXML来打开IndexXML然后再用相同的方法打开子XML,上述代码是可以的,但是,我现在需要自动在指定的Index路径下通过上述代码打开XML,所以就出现了上述问题,再次恳请大神们解救啊。

具体代码如下:

 CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle=_T("可视化文件打开对话框");
if(IDOK==fileDlg.DoModal())
{
    CXmlAnalysis xmlfileIndex;
    xmlfileIndex.SetFileName(XMLIndexPath);
    if(!xmlfileIndex.LoadXml())
        return;

    MSXML2::IXMLDOMNodePtr pRoot = NULL;
    pRoot = xmlfileIndex.GetXmlRootNode();
    if(NULL == pRoot)
        return;

    int iModuleCount = 0;
    MSXML2::IXMLDOMNodePtr pParent = NULL;
    iModuleCount = xmlfileIndex.GetXmlChildNodeCount(pRoot,_T("Root"));
    pParent = NULL;
    for(int j=0;j<=iModuleCount;j++)
    {
        int i=j+1;

        pParent = xmlfileIndex.GetXmlChildNode(pRoot,_T("Parent"),j);
        if(NULL == pParent)
            return;

        MSXML2::IXMLDOMNodePtr pNode = NULL;                
        //创建pNode节点
        pNode = xmlfileIndex.GetXmlChildNode(pParent,_T("fileName"),0);
        if(NULL == pNode)
            return;
        Root[i].fileName = xmlfileIndex.GetXmlNodeText(pNode);    

        pNode = xmlfileIndex.GetXmlChildNode(pParent,_T("filePath"),0);     
        //子XMLPath
        if(NULL == pNode)
            return;
        m_XMLtemp = xmlfileIndex.GetXmlNodeText(pNode); 
        Root[i].filePath = m_XMLtemp;

        pNode = xmlfileIndex.GetXmlChildNode(pParent,_T("fileKind"),0);
        if(NULL == pNode)
            return;
        m_XMLtemp = xmlfileIndex.GetXmlNodeText(pNode); 
        int middle_fileKind;
        m_XMLtemp=m_XMLtemp.Mid(1,2);
        middle_fileKind=atoi(m_XMLtemp);
        Root[i].fileKind=(WORD)middle_fileKind;

        if(Root[i].ModuleKind==1)
        {
            CXmlAnalysis xmlfile1;        
            xmlfile1.SetFileName(Root[i].filePath);
            if(!xmlfile1.LoadXml())
                return;

            MSXML2::IXMLDOMNodePtr pRootMod = NULL;
            pRootMod = xmlfile1.GetXmlRootNode();                   
            //创建pRootMod 指向XML文件1
            if(NULL == pRootMod)
                return;

            MSXML2::IXMLDOMNodePtr pParentMod = NULL;               
            //创建pParentMod 指向Module节点
            pParentMod = xmlfile1.GetXmlChildNode(pRootMod,_T("Module"),0);
            if(NULL == pParentMod)
                return;

            MSXML2::IXMLDOMNodePtr pNodeMod = NULL;             
            //创建pNodeMod节点
            pNodeMod = xmlfile1.GetXmlChildNode(pParentMod,_T("Name"),0);
            if(NULL == pNodeMod)
                return;
            Node[i].Name = xmlfile1.GetXmlNodeText(pNodeMod); 
            xmlfile1.UnloadXml();
        }
        else if(Root[i].ModuleKind==2)
        {
            CXmlAnalysis xmlfile2;    
            xmlfile2.SetFileName(Root[i].filePath);
            if(!xmlfile2.LoadXml())
                return;

            MSXML2::IXMLDOMNodePtr pRootMod = NULL;
            pRootMod = xmlfile2.GetXmlRootNode();                   
            //创建pRootMod 指向XML文件2
            if(NULL == pRootMod)
                return;

            MSXML2::IXMLDOMNodePtr pParentMod = NULL;               
            //创建pParentMod 指向Module节点
            pParentMod = xmlfile2.GetXmlChildNode(pRootMod,_T("Module"),0);
            if(NULL == pParentMod)
                return;

            MSXML2::IXMLDOMNodePtr pNodeMod = NULL;             
            //创建pNodeMod节点
            pNodeMod = xmlfile2.GetXmlChildNode(pParentMod,_T("Name"),0);
            if(NULL == pNodeMod)
                return;
            Node[i].Name = xmlfile2.GetXmlNodeText(pNodeMod); 
            xmlfile2.UnloadXml();
        }
    }
    xmlfileIndex.UnloadXml();
}
  • 写回答

4条回答 默认 最新

  • oyljerry 2015-05-16 10:37
    关注

    需要一定调用Unloadxml函数吗,不调用试试。

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料