从jansson libary创建json请求的可用内存是什么?

时间:2018-05-08 05:14:28

标签: c memory-leaks jansson

我正在使用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?

1 个答案:

答案 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)释放内存。