Утечка памяти при использовании JSON-C - PullRequest
8 голосов
/ 05 января 2012

Я новичок в 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.

Заранее спасибо

Ответы [ 3 ]

8 голосов
/ 20 октября 2012

НЕТ, нам нужно вызывать json_object_put только один раз для корневого объекта, если мы явно не выделяем память для json-объекта, и это сработало для меня ..... !!

6 голосов
/ 06 марта 2012

Да, я верю, что ваш код будет пропускать память. Проблема в том, что вы перезаписываете указатель 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 имеет режим подсчета ссылок, который может дать вам больше информации об объектах. Дайте мне знать, и я могу уточнить это подробнее.

0 голосов
/ 30 мая 2019

json_tokener_parse() создаст объект, который необходимо удалить. в этом случае

json_object_put(new_obj);

требуется.

...