Как освободить 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
}

Вам нужно сделать это только один раз, но библиотека может измениться.

Другие вопросы по тегам