std :: list copy to std :: vector跳过元素

时间:2013-10-31 13:37:35

标签: c++ xcode objective-c++ stdlist

我在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
}

1 个答案:

答案 0 :(得分:0)

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

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

我在xcode中使用了malloc guard来定位释放内存的使用。它指出了这一行:

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);
}