2012-01-05 22 views
6

Jestem nowy w JSON-C, Proszę zobaczyć mój przykładowy kod i daj mi znać, stworzy dowolny wyciek pamięci, jeśli tak, to jak zwolnić obiekt JSON-C.Wyciek pamięci za pomocą 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 ?? 

Czy muszę wyczyścić new_obj, jeśli tak, to w jaki sposób. Czy ktoś może pomóc w zrozumieniu sposobu zarządzania pamięcią JSON-C.

Z góry dziękuję

+0

Szybkie wyszukiwanie w Internecie wydaje się wskazywać, że JSON-C używa licznika odwołań do zarządzania instancjami 'json_object', a funkcja używana do" uwolnienia "instancji to [json_object_put] (http://oss.metaparadigm.com/json- c/doc/html/json__object_8h.html # a15). – hmjd

Odpowiedz

7

NIE, Musimy wywołać json_object_put tylko raz dla obiektu root, o ile nie przypisujemy jawnie pamięci do obiektu Json i działało to dla mnie ..... !!

5

Tak, wierzę, że Twój kod wycieknie z pamięci. Problem polega na tym, że wielokrotnie nadpisujesz wskaźnik new_obj. Twój kod powinien wyglądać mniej więcej tak:

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); 

Proszę dać mi znać, jeśli to działa dla Ciebie. Jeśli potrzebujesz dodatkowej pomocy, json-c ma tryb licznika referencyjnego, który daje więcej informacji o obiektach. Daj mi znać, a będę mógł to dokładniej omówić.

+3

NIE, Musimy wywołać json_object_put tylko raz dla obiektu root, o ile nie przydzielamy jawnie pamięci do obiektu Json i to działało dla mnie ..... !! –

+0

Tak, faktycznie masz rację. Wystarczy zadzwonić raz na obiekt główny! – portforwardpodcast