Json C用法釋疑

2021-07-29 13:17:13 字數 3005 閱讀 5946

實際專案中發現json-c用法不當導致的記憶體洩露、踩記憶體問題,大都是因為不清楚下面幾個介面的用法。

以下分析基於 0.12.1 release)。

int main(int argc, char **argv)

上面的**執行後,你會發現洩漏下面這些記憶體:

memory not freed:

-----------------

address size caller

0x0000000000b6a460

0x48 at json-c

-json-c-

0.12.1-

20160607/json_object.c:185

0x0000000000b6a4b0

0x58 at json-c

-json-c-

0.12.1-

20160607/linkhash.c:435

0x0000000000b6a510

0x200 at json-c

-json-c-

0.12.1-

20160607/linkhash.c:440

所以,json_object_new_object生成的物件必須呼叫json_object_put釋放

int main(int argc, char **argv)

"; struct json_object* obj = json_tokener_parse(str);

//json_object_put(obj);

return

0;}

上面這些**執行後,你會發現下面這些 記憶體洩漏:

memory not freed:

-----------------

address size caller

0x00000000022e7930

0x48 at json-c

-json-c-

0.12.1-

20160607/json_object.c:185

0x00000000022e7980

0x58 at json-c

-json-c-

0.12.1-

20160607/linkhash.c:435

0x00000000022e79e0

0x200 at json-c

-json-c-

0.12.1-

20160607/linkhash.c:440

0x00000000022e7c10

0x48 at json-c

-json-c-

0.12.1-

20160607/json_object.c:185

所以,json_tokener_parse生成的物件,必須使用json_object_put釋放.

int main(int argc, char **argv)

借助記憶體越界檢測工具efence和gdb,執行**發現段錯誤,其中test.c:22指向json_object_put(obj)這一行.

這是因為child節點被釋放過了,現在又去釋放, 使用了野指標(不借助工具,程式會正常結束,這也是這種錯誤的可怕之處)。

這種不會立即終止程式的錯誤太可怕 ,讓你都不知道怎麼死的。

program received signal sigsegv, segmentation fault.

json_object_put (jso=0x7ffff7ee2fb8) at json_object.c:154

154 jso->_ref_count--;

(gdb) bt

#0 json_object_put (jso=0x7ffff7ee2fb8) at json_object.c:154

#1 0x0000000000403346 in lh_table_free (t=0x7ffff7edefa8) at linkhash.c:485

#2 0x000000000040190d in json_object_object_delete (jso=0x7ffff7edcfb8) at json_object.c:354

#3 0x0000000000401edd in json_object_put (jso=0x7ffff7edcfb8) at json_object.c:159

#4 json_object_put (jso=0x7ffff7edcfb8) at json_object.c:150

#5 0x0000000000401515 in main (argc=1, argv=0x7fffffffdfd8) at test.c:22

所以,通過json_object_object_get獲取的物件不能單獨釋放,因為它仍然歸父節點所有。

int main(int argc, char **argv)

這個執行後,產生的錯誤和3中類似,也是因為重複釋放。

所以,通過json_object_object_add新增到其他節點的不能再單獨釋放,因為他已經成為別人的子節點,他的生命週期由父節點維護了。

int main(int argc, char **argv)

這個free也是非法的,因為json_object_to_json_string只是把json物件內部的指標暴露給你了,借你用下而已,千萬別釋放。

上面這幾點疑惑,通過api介面描述文件都可以消除掉,再不濟看看作者的demo、原始碼也可以消除掉。

所以,大家使用開源軟體時,一定要搞明白再用,否則會帶來很多問題。

json C使用小結

json c 0.7庫使用小結 json c這個庫 可以很方便的生成js的json字串.主要幾個函式如下 json object to file filepath,json object 將json object寫到檔案中 json object from file filepath 從檔案中讀出j...

json c使用 介紹

3 函式介紹 參考文章 簡單介紹下json c庫的一些函式。在編譯前需要linux pc上確認以下被安裝 apt get install autoconf automake libtool.configure cc arm linux gcc host arm linux prefix pwd in...

JSON c語言,資料交換

一 c語言獲取json中的資料 先要有cjosn庫,兩個檔案分別是cjson.c和cjson.h。二 json資料結構 c語言中json資料是採用鍊錶儲存的 typedef struct cjson cjson 三 cjson使用 1 字串解析成json結構體 1 講字串解析成json結構體。cjs...