9

JSON-Cは初めてです。サンプルコードを参照して、メモリリークが発生することを知らせてください。そうであれば、JSON-Cオブジェクトを解放する方法を教えてください。

    struct json_object *new_obj         = NULL;
    new_obj = json_tokener_parse(strRawJSON);
    new_obj = json_object_object_get(new_obj, "FUU");
    if(NULL == new_obj){
        SYS_OUT("\nFUU not found in JSON");
        return NO;
    }
    new_obj = json_object_object_get(new_obj, "FOO"); // I m re-using new_obj, without free it?  
    if(NULL == new_obj){
        SYS_OUT("\nFOO not found in JSON");
        return NO;
    }
    // DO I need to clean new_obj, if yes then how ??

new_objをクリーンアップする必要がありますか?はいの場合、その方法。誰かがメモリ管理JSON-Cを行う方法を理解するのを助けることができますか?

前もって感謝します

4

3 に答える 3

9

いいえ、json-objectにメモリを明示的に割り当てていない限り、ルートオブジェクトに対してjson_object_putを1回だけ呼び出す必要があります。これは、私にとってはうまくいきました。

于 2012-10-20T03:42:04.833 に答える
7

はい、あなたのコードはメモリリークを起こすと思います。問題は、new_objポインタを複数回上書きしていることです。コードは次のようになります。

struct json_object *new_obj, *fuu_obj, *foo_obj;
new_obj = json_tokener_parse(strRawJSON);
fuu_obj = json_object_object_get(new_obj, "FUU");
if(NULL == new_obj){
    SYS_OUT("\nFUU not found in JSON");
    return NO;
}
foo_obj = json_object_object_get(new_obj, "FOO"); 
if(NULL == new_obj){
    SYS_OUT("\nFOO not found in JSON");
    return NO;
}
json_object_put(foo_obj);
json_object_put(fuu_obj);
json_object_put(new_obj);

これでうまくいくかどうか教えてください。さらにヘルプが必要な場合は、json-cに参照カウントモードがあり、オブジェクトに関する詳細情報を提供できます。私に知らせてください、そして私はこれについてもっと詳しく説明することができます。

于 2012-03-06T03:41:19.500 に答える
2

json_tokener_parse()削除する必要のあるオブジェクトを作成します。この場合

json_object_put(new_obj);

必要とされている。

于 2019-05-30T06:58:25.170 に答える