2012-01-05 22 views
6

Soy nuevo en JSON-C, por favor ver mi código de ejemplo y que me haga saber de que va a crear ninguna pérdida de memoria, si es sí, entonces cómo liberar objeto JSON-C.pérdida de memoria Uso de 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 ?? 

Necesito limpiar new_obj, si es así, cómo. ¿Puede alguien ayudar a entender cómo hacer la gestión de memoria JSON-C.

Gracias de antemano

+0

Una búsqueda rápida en la web parece indicar que JSON-C utiliza el recuento de referencias para administrar instancias 'json_object' y la función utilizada para" liberar "las instancias es [json_object_put] (http://oss.metaparadigm.com/json- c/doc/html/json__object_8h.html # a15). – hmjd

Respuesta

7

No, necesitamos llamar json_object_put sólo una vez por objeto raíz, siempre y cuando no estamos asignando memoria explícitamente a JSON a objetos y esto funcionó para mí ..... !!

5

Sí, creo que su código perderá memoria. El problema es que está sobrescribiendo su puntero new_obj varias veces. Su código debe ser algo como esto:

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

Háganme saber si esto funciona para usted. Si desea más ayuda, json-c tiene un modo de recuento de referencias que puede proporcionarle más información sobre los objetos. Avísame y puedo profundizar en esto más.

+3

NO, Necesitamos llamar a json_object_put solo una vez para el objeto raíz, siempre y cuando no estemos asignando memoria a json-object y esto funcionó para mí ..... !! –

+0

Sí, en realidad, tienes razón. ¡Solo necesita llamar una vez para el objeto raíz! – portforwardpodcast