0

在我的 Objective-C 应用程序中运行 C++ 代码时,我遇到了一个相当奇怪的异常。我正在使用 libxml2 读取 XSD 文件。然后,我将相关标签作为 Tag 类的实例存储在 std::list 中。然后我使用列表上的迭代器将此列表复制到 std::vector 中。但是,有时列表中的某些元素不会复制到向量中。任何帮助将不胜感激。

 printf("\n length list = %lu, length vector = %lu\n",XSDFile::tagsList.size(), XSDFile::tags.size() );
std::list<Tag>::iterator it = XSDFile::tagsList.begin();
//result: length list = 94, length vector = 0

/*
for(;it!=XSDFile::tagsList.end();++it)
{
    XSDFile::tags.push_back(*it); //BAD_ACCESS code 1  . .  very bizarre . . . . 25
}

 */
std::copy (XSDFile::tagsList.begin(), XSDFile::tagsList.end(), std::back_inserter (XSDFile::tags));

printf("\n Num tags in vector = %lu\n", XSDFile::tags.size());

if (XSDFile::tagsList.size() !=  XSDFile::tags.size())
{
    printf("\n length list = %lu, length vector = %lu\n",XSDFile::tagsList.size(), XSDFile::tags.size() );
    //result: length list = 94, length vector = 83
}
4

1 回答 1

0

我发现了问题。内存损坏导致 std::list 在解析 XSD 期间损坏。我使用函数 start_element 解析 XSD。

xmlSAXHandler handler = {0};
handler.startElement = start_element;

我在 xcode 中使用 malloc 保护来定位释放内存的使用。它指向了这条线:

std::strcpy(message, (char*)name);

所以我删除了malloc(实际上在代码中注释)并且它起作用了。std::vector 现在一致地复制列表的所有 94 个条目。如果有人解释为什么这样做会很好。

static void start_element(void * ctx, const xmlChar *name, const xmlChar **atts)
{    
// int len = strlen((char*)name);

//    char *message = (char*)malloc(len*sizeof(char));
//    std::strcpy(message, (char*)name);

if (atts != NULL)
{
 //   atts[0] = type
 //   atts[1] = value

 //   len = strlen((char*)atts[1]);
 //   char *firstAttr = (char*)malloc(len*sizeof(char));
 //   std::strcpy(firstAttr, (char*)atts[1]);


     if(strcmp((char*)name, "xs:include")==0)
     {   
         XSDFile xsd;
         xsd.ReadXSDTypes((char*)atts[1]);
     }

     else if(strcmp((char*)name, "xs:element")==0)
     {
         doElement(atts);
     }


     else if(strcmp((char*)name, "xs:sequence")==0)
     {
         //set the default values
         XSDFile::sequenceMin = XSDFile::sequenceMax = 1;

         if (sizeof(atts) == 4)
         {
            if(strcmp((char*)atts[3],"unbounded")==0)
                XSDFile::sequenceMax = -1;

             int i = 0;
             while(atts[i] != NULL)
             {
                 //atts[i] = name
                 //atts[i+i] = value

                 std::string name((char*)atts[i]);
                 std::string value((char*)atts[i+1]);

                 if(name=="minOccurs")
                     XSDFile::sequenceMin = (atoi(value.c_str()));
                 else if(name=="maxOccurs")
                     XSDFile::sequenceMax = (atoi(value.c_str()));

                 i += 2;
             }

         }

     }
}

//free(message);
}
于 2013-11-01T14:04:05.000 回答