0

Facebook の友達リストを JSON 形式で取得し、解析して、特定のデータ構造にロードするプロジェクトに取り組んでいます。

この場合、arrayList に入れています。私は、教授がオンラインで見つけて使用を推奨したVJSONというライブラリを使用しています。私はコンピュータ エンジニアリングの 2 年生にすぎないので、これらのライブラリにあるほとんどの資料は、クラスの他の全員と同様に、私の頭上にあるものです。それでも彼はとにかくそれを使うことを勧めました。

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

1 に答える 1

0

https://code.google.com/p/vjson/より

警告: vjson は破壊的なパーサーです。つまり、ソース バッファーが変更されます。

これにより、割り当て解除時にエラーが発生する可能性があると思いますinputStr

于 2013-07-27T16:44:17.307 に答える