Как освободить json_object?
У меня есть следующий код
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <json/json.h>
int main(int argc, char **argv)
{
json_object *new_obj;
char buf[] = "{ \"foo\": \"bar\", \"foo2\": \"bar2\", \"foo3\": \"bar3\" }"
new_obj = json_tokener_parse(buf);
.....
json_object_put(new_obj);
}
Ли json_object_put(new_obj)
освободить всю память, связанную с new_obj
?
1 ответ
Из документации:
void json_object_put (struct json_object *this)
Уменьшить счетчик ссылок json_object и освободить, если он достигнет нуля
Источник: http://oss.metaparadigm.com/json-c/doc/html/json__object_8h.html
Вы должны понимать, как работает библиотека.
json_tokener_parse()
является первым, и он создает объект, который будет действовать как родительский объект, управляющий памятью, который все объекты, созданные из него, используют для доступа к данным, которые они определяют.
Итак, если вы дошли до создания char *str для строкового поля, это поле фактически не хранит строку, исходный объект, возвращенный из json_tokener_parse()
делает.
Это причина того, что вы не можете просто использовать обычный free() и ожидать, что все будет работать, как если бы это был массив символов или что-то в этом роде.
На всякий случай не используйте json_tokener_parse_ex()
функции, потому что вам также нужно будет освободить объект, который является токенером, с помощью json_tokener_parse()
вам не нужен этот аргумент.
Кроме того, чтобы безопасно закрыть все, просто выполните:
while (json_object_put(orig_object) != 1) {
// keep freeing
}
Вам нужно сделать это только один раз, но библиотека может измениться.