json_object_object_add, ошибка сегментации

Я использую libjosn-c как показано ниже, и возникает ошибка ошибки сегментации.

Если я уберу строку json_object_object_add(root, "Child", value);Ошибка не возникает.

int main(int argc, char **argv)
{
    json_object *root = NULL, *value = NULL;

    root = json_object_new_string("My Object");
    value = json_object_new_string("My Child Object");
    json_object_object_add(root, "Child", value);
    printf("to string =%s\n", json_object_to_json_string(root));

    json_object_put(value);
    json_object_put(root);

    return 0;
}

Я не опытный в libjson-c, Спасибо за вашу помощь!

4 ответа

На вашем месте я бы прочитал документацию библиотеки, прежде чем начать ее использовать.

Как описано здесь json_object_object_add(root, "Child", value) передает право собственности на value в root, Это означает, что вы больше не несете ответственности за json_object_putэто Когда ты json_object_put root Это json_object_putс value для тебя.

Когда ты json_object_put value, его счетчик ссылок падает до 0, и его память освобождается. Когда ты json_object_put rootПопытка json_object_put value и терпит неудачу, потому что value более не существует.

Если вы не хотите value пережить rootПросто удалите json_object_put(value) линия.

Если вы хотите использовать value после root освобождается, используйте:

json_object_object_add(root, "Child", json_object_get(value))

Потому что json_object_put(root) освобождает все объекты, которыми он владеет. Так как вы добавили "значение" к "корню", когда вы делали пут (root), он также делал пут (значение). Имея свой json_object_put (значение), вы освобождали память для значения, а когда вы делали json_object_put(root), он также пытался освободить память для значения, и, поскольку он уже был освобожден, вы вызвали ошибку сегментации.

Спасибо за ваш ответ!

Как я понимаю ваше объяснение, просто удалите строку json_object_put(value);

Однако я не понимаю, почему линия json_object_object_add(root, "Child", value); вызывает ошибку.

Спасибо за помощь.

Проблема в оф. Ваша программа создает два экземпляра json_type_string, к которому вы пытаетесь добавить пару ключ/значение к той, которая называется . Библиотека json-c, вероятно, должна была обнаружить неверный rootи проигнорировал запрос на добавление или что-то в этом роде, но вместо этого вылетает при вызове json_object_object_add(root, "Child", value);(крах можно воспроизвести как минимум в v0.11 json-c).

Если вместо этого вы написали программу как:

      int main(int argc, char **argv)
{
  json_object *root = NULL, *value = NULL;

  root = json_object_new_object();                    /* json_type_object */
  value = json_object_new_string("My Child Object");  /* json_type_string */
  json_object_object_add(root, "Child", value);
  printf("to string =%s\n", json_object_to_json_string(root));

  json_object_put(root);

  return 0;
}

он работает и возвращает результат

      to string ={ "Child": "My Child Object" }

Вы можете использовать такие функции, как json_object_get_type()определить json_typeиз json_objectесли вы пишете функцию, которая принимает единицу в качестве параметра.

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