从 jansson 库创建 json 请求时释放内存的正确方法是什么?

what is the proper way of free memory in creating json request from jansson libary?

我正在使用 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 的这一调用是否足以释放所有内存? 我的担心主要是在读完这篇文章后 post

您正在使用不同的函数来设置 JSON 字符串:json_object_set_new 而不是链接问题中的 json_object_set

您的版本将元素添加到 json 对象和 "reuses" 引用。它不会增加计数器。 因此您不需要手动递减它。 该问题答案下方的评论也提到了 json_object_set_new.

添加的元素将与主要 JSON 对象 json_body 一起释放。 这意味着所有子对象的引用计数器都会自动递减。如果计数器降为 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) 来释放内存。