я использую 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
,
Спасибо за вашу помощь!
На твоем месте я бы прочитал документация библиотеки, прежде чем начать ее использовать.
Как описано Вот 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(value);
Однако я не понимаю, почему линия json_object_object_add(root, "Child", value);
вызывает ошибку.
Спасибо за помощь.
Потому что json_object_put (root) освобождает все объекты, которыми он владеет. Так как вы добавили «значение» к «корню», когда вы делали пут (root), он также делал пут (значение). Имея свой json_object_put (значение), вы освобождали память для значения, а когда вы делали json_object_put (root), он также пытался освободить память для значения, а поскольку он уже был освобожден, вы вызывали ошибку сегментации.