文件
json_object_new_object
说
记住,当使用json_object_object_add或json_object_array_put_idx时,所有权将转移到对象/数组。
和
您获得但未转移的任何所有权必须通过json_object_put释放。
对我来说,这意味着这应该是正常的:
json_object *jobj1 = json_object_new_object();
json_object *jobj2 = json_object_new_object();
json_object_object_add(jobj1, "Object", jobj2);
// ...
json_object_put(jobj1); // This is the only one we have ownership of now
是的,就像文件上说的,你
必须
释放你所有的权利使用
json_object_put
.
关于
json_tokener_parse
,文档没有明确说明任何关于所有权或发布的内容,但我会
非常
如果不一样会很惊讶
json_object_new_object
在这方面。如果不允许使用从
json_tokener_parse
使用通过
json_object_new_对象
.
例如,应该可以这样做:
json_object *jobj1 = json_object_new_object(); // "Manual" object
json_object *jobj2 = json_tokener_parse(...); // Parsed object
// At this point, jobj1->_ref_count and jobj2->_ref_count will both be 1.
// We could now add the parsed object as a new field in our "manual" one:
json_object_object_add(jobj1, "ParsedObject", jobj2);
// ...
// In the end, we only have to release the "manual" object.
json_object_put(jobj1);
而且,是的,正如你的Valgrind日志所指出的那样,
JSON标记器分析
函数调用
json_object_new_对象
在幕后,所以你需要打电话
JSON-ObjutoPoT
对于返回的对象(即,除非您将其合并到另一个对象或数组中,如前所述)。
在引用文件中编写代码的人
blog post
似乎不关心程序中的内存泄漏,也许是因为该程序非常简单,只处理一个对象后立即结束。