69,382
社区成员
发帖
与我相关
我的任务
分享
jsonc 库是一个c的json库, 最近一直用它, 有些使用过程的想法, 写在这里.
使用c库最关心的是内存谁来分配, 谁来释放. jsonc的内存管理方式, 是基于引用计数的内存树(链), 如果把一个struct json_object 对象a, add到另一个对象b上, 就不用显式的释放(json_object_put) a了, 相当于把a挂到了b的对象树上, 释放b的时候, 就会释放a. 当a即add到b上, 又add到对象c上时会导致a被释放两次(double free), 这时可以增加a的引用计数(调用函数json_object_get(a)), 这时如果先释放b, 后释放c, 当释放b时, 并不会真正的释放a, 而是减少a的引用计数为1, 然后释放c时, 才真正释放a.
如果理解了这些, 使用jsonc库, 基本就不会有什么问题了.
Hardware watchpoint 8: *(long *)(g_config->host_info.posturl+12)
Old value = 1702047589
New value = 1702047588
json_object_put (jso=0x8056930) at json_object.c:142
142 if(!jso->_ref_count) jso->_delete(jso);
extern void json_object_put(struct json_object *jso)
{
if(jso) {
jso->_ref_count--;
if(!jso->_ref_count) jso->_delete(jso);
}
}