使用JSON-C出现内存泄漏问题

9

我是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内存管理。

提前感谢


一个快速的网络搜索似乎表明,JSON-C使用引用计数来管理json_object实例,并且用于“释放”实例的函数是json_object_put - hmjd
3个回答

9
不需要,只要我们没有显式分配json对象的内存,我们只需要一次调用json_object_put来释放根对象即可,这对我有效……!!

7

是的,我相信你的代码会泄漏内存。问题在于你多次覆盖了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具有引用计数模式,可以提供有关对象的更多信息。让我知道,我可以进一步详细说明。


6
只要我们没有明确分配内存给JSON对象,就只需对根对象调用一次json_object_put函数。这个方法对我很有效...! - Madhu S. Kapoor
2
是的,实际上你是正确的。你只需要为根对象调用一次put! - benathon

2

json_tokener_parse()会创建一个需要被删除的对象。

在这种情况下,

json_object_put(new_obj);

是必须的。"最初的回答"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接