1

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

4

1 回答 1

3

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

您的版本将元素添加到 json-object 并“重用”引用。它不会增加计数器。因此,您不需要手动减少它。该问题的答案下方的评论也提到了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)来释放内存。

于 2018-05-08T07:19:02.573 回答