Документация для 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_object
.
Например, должно быть возможно сделать это:
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_tokener_parse
вызывает json_object_new_object
за кулисами, поэтому вам нужно вызвать json_object_put
для возвращаемого объекта (т.е., если вы не включите его в другой объект или массив , как упоминалось ранее).
Парень, который написал код в упомянутом сообщении в блоге , похоже, не заботится об утечке памяти в своей программе, возможно, потому что эта программа настолько проста и заканчивается сразу после обработки только одного объекта.