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
если вы пишете функцию, которая принимает единицу в качестве параметра.