从 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)
来释放内存。
我正在使用 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)
来释放内存。