C 从jansson库创建json请求时,释放内存的正确方法是什么?
我使用janson库将json正文作为rest请求发送,我注意到我是这样做的: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",
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()函数保存的返回引用?正确的?