2012-01-05 71 views
6

私は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のメモリ管理の仕方を理解することができます。アドバンス

+0

JSON-Cが参照カウントを使用して 'json_object'インスタンスを管理し、インスタンスを解放するために使用される関数が[json_object_put](http://oss.metaparadigm.com/json- c/doc/html/json__object_8h.html#a15)。 – hmjd

答えて

7

いいえ、json-objectに明示的にメモリを割り当てていない限り、json_object_putをルートオブジェクトに対して一度だけ呼び出す必要があります。

5

おかげではい、私はあなたのコードがメモリリークと確信しています。問題は、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には参照カウントモードがあり、オブジェクトに関する詳細情報を得ることができます。私に教えてください。私はこれ以上詳しく説明できます。

+3

いいえ、明示的にjson-objectにメモリを割り当てていない限り、私はjson_object_putをルートオブジェクトに対して一度だけ呼び出す必要があります。 –

+0

はい、あなたは正しいです。あなたは、ルートオブジェクトのputを1回だけ呼び出す必要があります! – portforwardpodcast

関連する問題