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

C 从jansson库创建json请求时,释放内存的正确方法是什么?,c,memory-leaks,jansson,C,Memory Leaks,Jansson,我使用janson库将json正文作为rest请求发送,我注意到我是这样做的: 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",

我使用janson库将json正文作为rest请求发送,我注意到我是这样做的:

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字符串:
JSON\u object\u set\u new
而不是链接问题中的
JSON\u object\u set

您的版本将元素添加到json对象并“重用”引用。它不会使计数器递增。 因此,您不需要手动将其递减。 该问题答案下面的注释还提到了
json\u object\u set\u new

添加的元素将与主JSON对象一起释放
JSON\u body
。 这意味着所有子对象的引用计数器将自动递减。如果计数器降到0,则对象是自由的

如果您自己持有对子对象的引用,则该对象将不自由

举个例子:

创建一个对象(调用
json\u string()
),它将获得引用计数==1

变体a)(来自链接问题)

将此对象添加到具有新引用的另一个对象。 这是使用
json\u object\u set
完成的。然后计数器增加到2

如果删除主对象(
json\u decref(json\u body)
),计数器将再次下降到1,但字符串仍然没有释放。 您需要使用
json\u decref(srting)
来释放内存

变体b)(您的代码)

将此对象添加到另一个对象中,并移交现有引用。 这是使用
json\u object\u set\u new
完成的。然后计数器保留为值1

如果删除主对象(
json\u decref(json\u body)
),计数器将下降到0,现在字符串将与主对象一起释放。
您无需使用
json\u decref(srting)
来释放内存。

您正在使用不同的函数来设置json字符串:
json\u object\u set\u new
而不是链接问题中的
json\u object\u set

您的版本将元素添加到json对象并“重用”引用。它不会使计数器递增。 因此,您不需要手动将其递减。 该问题答案下面的注释还提到了
json\u object\u set\u new

添加的元素将与主JSON对象一起释放
JSON\u body
。 这意味着所有子对象的引用计数器将自动递减。如果计数器降到0,则对象是自由的

如果您自己持有对子对象的引用,则该对象将不自由

举个例子:

创建一个对象(调用
json\u string()
),它将获得引用计数==1

变体a)(来自链接问题)

将此对象添加到具有新引用的另一个对象。 这是使用
json\u object\u set
完成的。然后计数器增加到2

如果删除主对象(
json\u decref(json\u body)
),计数器将再次下降到1,但字符串仍然没有释放。 您需要使用
json\u decref(srting)
来释放内存

变体b)(您的代码)

将此对象添加到另一个对象中,并移交现有引用。 这是使用
json\u object\u set\u new
完成的。然后计数器保留为值1

如果删除主对象(
json\u decref(json\u body)
),计数器将下降到0,现在字符串将与主对象一起释放。
您不需要使用
json\u decref(srting)
来释放内存。

而json\u字符串(sentString)也在执行malloc,它是否在这个json\u decref(json\u body)中获得自由;线路?或者我也需要一个单独的空闲?是的,只要引用计数下降到0,所有子对象都是空闲的。所以我需要做几次json_decref?多少次?根据我用一个新的json字符串?tank创建json_object_set_new的次数,因此我在发布的代码中理解,json_t*json_body=json_object()没有内存泄漏;而不是我没有为json_string()函数保存的返回引用?对吗?json_字符串(sentString)也在执行malloc,它在这个json_decref(json_body)中是免费的吗;线路?或者我也需要一个单独的空闲?是的,只要引用计数下降到0,所有子对象都是空闲的。所以我需要做几次json_decref?多少次?根据我用一个新的json字符串?tank创建json_object_set_new的次数,因此我在发布的代码中理解,json_t*json_body=json_object()没有内存泄漏;而不是我没有为json_string()函数保存的返回引用?正确的?