首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libxml2 : xmlFreeTextReader崩溃

libxml2 : xmlFreeTextReader崩溃
EN

Stack Overflow用户
提问于 2011-02-25 19:54:53
回答 1查看 917关注 0票数 0

我使用的是libxml2 (libxml2-2.7.8),在处理完XMl文件后调用xmlFreeTextReader时会崩溃。我不知道为什么会这样:

下面是我使用的代码:

代码语言:javascript
复制
int parseDevDescMessage(char *buffer, DMXDevice *dmxLocal)
{
  //xmlDocPtr xmlDocPointer;
  xmlTextReaderPtr xmlTextPointer;
  int           errorCode=0;
  const xmlChar *name, *value;
  char          *xmlBuffer;
  xmlNode       *rootElement = NULL;
  xmlNode       *currentNode = NULL;

  devServices   *devServicesLocal=NULL;
  devServices   *devServicesLocalAdd=NULL;

  /*
   * This initialize the library and check potential ABI mismatches
   * between the version it was compiled for and the actual shared
   * library used.
   */
  LIBXML_TEST_VERSION

  xmlBuffer = (char *)malloc(strlen(buffer));
  strcpy(xmlBuffer, buffer, strlen(buffer));
  /*I am doing this string copy because the variable buffer is referred in the calling function. I am assuming that xmlFreeTextReader is freeing the buffer also

  xmlTextPointer = xmlReaderForMemory(xmlBuffer, strlen(xmlBuffer), "somthing.xml", NULL, 0);
  if(xmlTextPointer == NULL)
  {
    #ifdef CTL_MSG_PARSER_DEBUG_NEW
      printf("parseDevDescMessage : ERROR WHITE CREATING XML DOC FROM MEM\n");
    #endif
    errorCode = -1;
    goto error;
  }

  errorCode = xmlTextReaderRead(xmlTextPointer);  
  while(errorCode == 1)
  {
    if( ( (strcmp(xmlTextReaderConstName(xmlTextPointer),"serviceList")) == 0 ) &&
        ( (xmlTextReaderNodeType(xmlTextPointer)) == 1)
 )
    {
      errorCode = xmlTextReaderRead(xmlTextPointer);
      while(errorCode == 1)
      {
        if( ( (strcmp(xmlTextReaderConstName(xmlTextPointer),"service")) == 0) &&
            ( (xmlTextReaderNodeType(xmlTextPointer)) == 1)
          )
        {
          devServicesLocal =  dmxLocal->deviceServices;

          if(!devServicesLocal)
          {
            devServicesLocal = (devServices *)malloc(sizeof(devServices));
            memset(devServicesLocal, 0, sizeof(devServices));
            dmxLocal->deviceServices = devServicesLocal;
            //devServicesLocalAdd      = devServicesLocal;
          }
          else
          {
            while(devServicesLocal->nextService)
            {
              devServicesLocal = devServicesLocal->nextService;
            }
            devServicesLocal->nextService = (devServices *)malloc(sizeof(devServices));
            memset(devServicesLocal->nextService, 0, sizeof(devServices));
            devServicesLocal = devServicesLocal->nextService;
          }
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);

          value = xmlTextReaderConstValue(xmlTextPointer);
          devServicesLocal->serviceType = (char *)malloc(strlen(value));
          strcpy(devServicesLocal->serviceType, value);


          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);

          value = xmlTextReaderConstValue(xmlTextPointer);
          devServicesLocal->serviceId = (char *)malloc(strlen(value));
          strcpy(devServicesLocal->serviceId, value);

          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);

          value = xmlTextReaderConstValue(xmlTextPointer);
          devServicesLocal->SCPDURL = (char *)malloc(strlen(value));
          strcpy(devServicesLocal->SCPDURL, value);


          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);

          value = xmlTextReaderConstValue(xmlTextPointer);
          devServicesLocal->eventSubURL  = (char *)malloc(strlen(value));
          strcpy(devServicesLocal->eventSubURL, value);


          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);
          errorCode = xmlTextReaderRead(xmlTextPointer);

          value = xmlTextReaderConstValue(xmlTextPointer);
          devServicesLocal->controlURL  = (char *)malloc(strlen(value));
          strcpy(devServicesLocal->controlURL, value);

        }
        else
        {
          errorCode = xmlTextReaderRead(xmlTextPointer);
        }
      }
    }
    else
    {
      errorCode = xmlTextReaderRead(xmlTextPointer);
    }
  }
  error:
  xmlMemoryDump();
  **xmlFreeTextReader(xmlTextPointer);**
  xmlCleanupParser();  
  return errorCode;
}

有人能解释一下为什么在调用xmlFreeTextReader(xmlTextPointer)时代码会崩溃吗

EN

回答 1

Stack Overflow用户

发布于 2011-02-25 22:28:28

我使用了VALGRIND,发现了一些内存问题。我一个接一个地修复了所有与内存相关的问题,最后这个崩溃消失了。可能在某个地方,因为这个内存被保存的损坏,因为当它被释放时,它正在崩溃。

谢谢,

-Sun

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5116917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档