C++ 使用VJSON解析C++;,遇到内存问题,我该如何解决?

C++ 使用VJSON解析C++;,遇到内存问题,我该如何解决?,c++,parsing,pointers,malloc,xcode4.5,C++,Parsing,Pointers,Malloc,Xcode4.5,我正在做一个项目,它以JSON格式获取你的Facebook好友列表,对其进行解析,并将其加载到特定的数据结构中 在本例中,我将它放入arrayList。我正在使用一个图书馆,我们的教授在网上找到了这个图书馆,并建议我们使用它。我只是一名计算机工程专业的大二学生,所以那些图书馆里的大部分东西都有点超出我的想象,和班上的其他人一样。然而,他建议我们无论如何都要使用它 VJSON类解析JSON文本文件并将其存储在javascript对象中。您可以通过从“根”开始并以链表样式格式继续访问下一个对象来访问

我正在做一个项目,它以JSON格式获取你的Facebook好友列表,对其进行解析,并将其加载到特定的数据结构中

在本例中,我将它放入arrayList。我正在使用一个图书馆,我们的教授在网上找到了这个图书馆,并建议我们使用它。我只是一名计算机工程专业的大二学生,所以那些图书馆里的大部分东西都有点超出我的想象,和班上的其他人一样。然而,他建议我们无论如何都要使用它

VJSON类解析JSON文本文件并将其存储在javascript对象中。您可以通过从“根”开始并以链表样式格式继续访问下一个对象来访问这些对象

我已经把我用来收集变量的方法放在下面了。我们的教授还为我们提供了所有关于for循环的东西。如您所见,在for循环的底部,我创建了一个人,并将其放入我的arrayList中,该列表运行良好。但是,在成功创建、存储和打印了大约14个人之后,它突然遇到了一个运行时错误

我在xCode中运行了该项目,下面是它给我的错误:

Project2(4244) malloc: *** error for object 0x100103c18: incorrect checksum for freed object - object was probably modified after being freed.
 *** set a breakpoint in malloc_error_break to debug
很明显,我可以看出这是某种内存管理问题,但仅此而已。我不知道为什么任何物体会被释放;如果它以某种方式被释放了,为什么其他人都没有被释放?此外,我尝试使用一个朋友的朋友列表,用一个备用文本文件运行我的项目。在遇到同样的错误之前,它设法通过了大约30人的测试;到底为什么他的朋友比我的多

任何帮助都将不胜感激!这个VJSON的东西真是让我难以理解。谢谢大家!

arrayList createArrayList(string filename){
    arrayList people;

    ifstream fileInput(filename);

    //turn input stream into string

    // Black magic to turn input stream into string.  Remember to include streambuf header
    // This string constructor accepts an iterator to the start of the file input stream
    // and another one that represents the end of input character (which is supplied by calling the default constructor of the iterator).
    string inputStr((istreambuf_iterator<char>(fileInput)), istreambuf_iterator<char>());

    //parse file content into json object
    char *errorPos = 0;
    char *errorDesc = 0;
    int errorLine = 0;
    block_allocator allocator(1 << 10);

    json_value *root = json_parse(const_cast<char*>(inputStr.c_str()), &errorPos, &errorDesc, &errorLine, &allocator);

    //get the first element, data, this value is an array of JSON objects (people)
    json_value *list = root->first_child;

    //This outer loop addresses each person's JSON object
    for(json_value *it = list->first_child; it; it = it->next_sibling){
        //This inner loop looks at each key/value pair within each person object
        string first_name, last_name, birthday, hometownID, hometown, personIDstr;
        for(json_value *personKeys = it->first_child; personKeys; personKeys = personKeys->next_sibling){
            //If the key/value pair has a key of "first_name" collect value associated
            if(!string(personKeys->name).compare("first_name")){
                first_name = personKeys->string_value;


            }
            //collect last name
            else if(!string(personKeys->name).compare("last_name")){
                last_name = personKeys->string_value;
            }
            //collect birthday
            else if(!string(personKeys->name).compare("birthday")){
                birthday = personKeys->string_value;
                //trim bday to first five characters
                birthday = birthday.substr(0,5);
            }
            //collect hometown
            else if(!string(personKeys->name).compare("hometown")){
                for(json_value *homeKeys = personKeys->first_child; homeKeys; homeKeys = homeKeys->next_sibling){

                    if(!string(homeKeys->name).compare("id")){
                        hometownID = homeKeys->string_value;
                    }

                    if(!string(homeKeys->name).compare("name")){
                        hometown = homeKeys->string_value;
                    }
                }
            }
            else if(!string(personKeys->name).compare("id")){
                personIDstr = personKeys->string_value;
            }
            //create person object based on which values are included

        }

        Person person(birthday, first_name, last_name, hometown, 0);
        cout << person << endl;
        people.insert(people.size(), person);
        cout << people.get(people.size()-1) << endl;
    }
    return people;
}
arrayList createArrayList(字符串文件名){
arrayList人;
ifstream文件输入(文件名);
//将输入流转换为字符串
//将输入流转换为字符串的黑魔法。记住包含streambuf头
//这个字符串构造函数接受一个迭代器作为文件输入流的开始
//另一个表示输入字符的结尾(通过调用迭代器的默认构造函数提供)。
字符串inputStr((istreambuf_迭代器(fileInput)),istreambuf_迭代器();
//将文件内容解析为json对象
char*errorPos=0;
char*errorDesc=0;
int errorLine=0;
块分配器分配器分配器(1个第一个子;
//这个外部循环处理每个人的JSON对象
for(json\u value*it=list->first\u child;it;it=it->next\u sibling){
//这个内部循环查看每个person对象中的每个键/值对
字符串名、姓、生日、家乡ID、家乡、人名;
for(json_value*personKeys=it->first_child;personKeys;personKeys=personKeys->next_sibling){
//如果键/值对具有“first_name”键,则收集关联的值
如果(!string(personKeys->name).compare(“first_name”)){
第一个\u name=personKeys->string\u值;
}
//收集姓氏
如果(!string(personKeys->name).compare(“last_name”)){
last\u name=personKeys->string\u value;
}
//收集生日
如果(!string(personKeys->name)。比较(“生日”)){
生日=个人钥匙->字符串\u值;
//将bday修剪为前五个字符
生日=生日。substr(0,5);
}
//收藏故乡
如果(!string(personKeys->name)。比较(“家乡”)){
对于(json\u value*homeKeys=personKeys->first\u child;homeKeys;homeKeys=homeKeys->next\u sibling){
如果(!string(homeKeys->name).compare(“id”)){
hometownID=homeKeys->string\u值;
}
如果(!string(homeKeys->name).compare(“name”)){
家乡=家钥匙->字符串\u值;
}
}
}
如果(!string(personKeys->name).compare(“id”)){
personIDstr=personKeys->string_值;
}
//根据包含的值创建person对象
}
个人(生日、名、姓、家乡、0);
不能

警告:vjson是破坏性的解析器,即您的源缓冲区将被修改


我认为当
inputStr
解除分配时,这可能会导致错误。

在代码的哪一行发出错误?您需要找出哪个对象/指针受此影响,然后检查您的代码,看看您做错了什么。