Я работаю над проектом, который берет ваш список друзей на Facebook в формате JSON, анализирует его и загружает в определенные структуры данных.
В этом случае я помещаю это в arrayList. Я использую библиотеку, которую наш профессор нашел в Интернете и рекомендовал использовать, под названием VJSON. Я всего лишь студент-компьютерщик, поэтому большинство вещей в этих библиотеках, как и все остальные в классе, выше моей головы. И все же он порекомендовал нам использовать его в любом случае.
Класс VJSON анализирует текстовый файл JSON и сохраняет его в объектах javascript. Вы получаете доступ к этим объектам, начиная с «корня» и переходя к каждому следующему объекту в формате стиля связанного списка.
Ниже я описал метод, который использовал для сбора переменных. Наш профессор также предоставил нам все до цикла. Как вы можете видеть, в нижней части цикла 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;
}
От https://code.google.com/p/vjson/
Предупреждение: vjson является деструктивным парсером, т. Е. Ваш исходный буфер будет изменен.
Я думаю, что это может привести к ошибке, когда inputStr
dealocated.
Других решений пока нет …