我正在使用janson库发送json正文作为休息请求,我注意到我正在这样做:
json_t *json_body = json_object();
char sentString[100];
char sentStringSecond[100];
..
json_object_set_new(json_body, "sentString", json_string(sentString));
json_object_set_new(json_body, "sentStringSecond", json_string(sentStringSecond);
..
json_decref(json_body);
这一次调用json_decref是否足以释放所有内存? 我的担忧主要是在阅读这篇文章后 json_decref not freeing memory?
答案 0 :(得分:1)
您正在使用其他函数来设置JSON字符串:json_object_set_new
而不是链接问题中的json_object_set
。
您的版本将元素添加到json-object并且"重用"参考资料。它不会增加计数器。
因此,您不需要手动减量。
该问题答案下面的评论也提到了json_object_set_new
。
添加的元素将与主JSON对象json_body
一起自由添加。
这个meand所有子对象的引用计数器自动递减。如果计数器降至0,则该对象是免费的
如果您自己持有对子对象的引用,该对象将不自由
只是一个例子:
您创建一个对象(调用json_string()
),它将获得引用计数== 1.
变体a)(来自链接的问题)
使用新引用将此对象添加到另一个对象。
这是使用json_object_set
完成的。然后计数器增加到2。
如果删除主对象(json_decref(json_body)
),计数器将再次降至1但字符串仍未释放。
您需要使用json_decref(srting)
释放内存。
变体b)(您的代码)
将此对象添加到另一个对象并移交现有引用。
这是使用json_object_set_new
完成的。然后计数器保留在值1。
如果删除主对象(json_decref(json_body)
),计数器将降为0,现在字符串将与主对象一起释放。
您无需使用json_decref(srting)
释放内存。