dzsj1209 2015-05-16 02:47 采纳率: 25%
浏览 928

为什么在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();
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
    • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
    • ¥20 matlab yalmip kkt 双层优化问题
    • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
    • ¥88 实在没有想法,需要个思路
    • ¥15 MATLAB报错输入参数太多