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,
Спасибо за вашу помощь!

-1

Решение

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

Как описано Вот 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))

1

Другие решения

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

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

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

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

0

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

0
По вопросам рекламы [email protected]