2012-01-05 48 views
6

我是JSON-C的新手,請參閱我的示例代碼,並讓我知道它會創建任何內存泄漏,如果是,那麼如何釋放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。

在此先感謝

+0

快速網頁搜索似乎表明JSON-C使用引用計數來管理'json_object'實例,並且用於「釋放」實例的函數是[json_object_put](http://oss.metaparadigm.com/json- C/DOC/HTML/json__object_8h.html#A15)。 – hmjd 2012-01-05 16:50:57

回答

7

不,我們只需要爲根對象調用json_object_put一次,只要我們沒有明確地分配內存給json對象,並且這對我工作..... !!

5

是的,我相信你的代碼會泄漏內存。問題是你多次覆蓋你的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有一個引用計數模式,可以給你更多關於對象的信息。讓我知道,我可以詳細說明這一點。

+3

不,我們只需要爲根對象調用json_object_put一次,只要我們沒有明確地分配內存給json對象,並且這對我有用..... ..... !! – 2012-03-12 16:11:51

+0

其實你是對的。你只需要爲根對象調用一次即可! – portforwardpodcast 2012-04-05 18:05:49