2012-01-05 5 views
6

Sono nuovo di JSON-C, vedere il mio codice di esempio e fammi sapere creerà qualsiasi perdita di memoria, se sì, quindi come liberare oggetto JSON-C.Perdita di memoria utilizzando 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 ?? 

Devo pulire new_obj, se sì, come. Qualcuno può aiutare a capire come fare la gestione della memoria JSON-C.

Grazie in anticipo

+0

Una ricerca Web rapida sembra indicare che JSON-C utilizza il conteggio dei riferimenti per gestire le istanze di 'json_object' e la funzione utilizzata per" liberare "le istanze è [json_object_put] (http://oss.metaparadigm.com/json- c/doc/html/json__object_8h.html # A15). – hmjd

risposta

7

NO, Dobbiamo chiamare json_object_put una sola volta per l'oggetto root se non allociamo esplicitamente memoria a json-object e questo ha funzionato per me ..... !!

5

Sì, credo che il codice sarà una perdita di memoria. Il problema è che si sovrascrive il puntatore new_obj più volte. Il tuo codice dovrebbe essere qualcosa del tipo:

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

Per favore fatemi sapere se questo funziona per voi. Se vuoi più aiuto, json-c ha una modalità di conteggio dei riferimenti che ti può dare più informazioni sugli oggetti. Fammi sapere e posso approfondire questo argomento.

+3

NO, dobbiamo chiamare json_object_put una sola volta per l'oggetto root se non allociamo esplicitamente memoria a json-object e questo ha funzionato per me ..... !! –

+0

Sì, in realtà hai ragione. Devi solo chiamare put una volta per l'oggetto root! – portforwardpodcast