實際專案中發現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...