Как правильно освободить память при создании запроса json из библиотеки Янссона? - PullRequest
0 голосов
/ 08 мая 2018

Я использую библиотеку janson для отправки тела json в качестве запроса на отдых, я заметил, что делаю это следующим образом:

json_t *json_body = json_object();
char sentString[100];
char sentStringSecond[100];
..
json_object_set_new(json_body, "sentString", json_string(sentString));
json_object_set_new(json_body, "sentStringSecond", json_string(sentStringSecond);
..
json_decref(json_body);     

Достаточно ли одного этого вызова json_decref, чтобы освободить всю память? мое беспокойство в основном после прочтения этого поста json_decref не освобождает память?

1 Ответ

0 голосов
/ 08 мая 2018

Вы используете другую функцию для установки строк JSON: json_object_set_new вместо json_object_set из связанного вопроса.

Ваша версия добавляет элемент в json-объект и "повторно" использует ссылку. Это не увеличивает счетчик. Поэтому вам не нужно уменьшать его вручную. В комментарии под ответом на этот вопрос также упоминается json_object_set_new.

Добавленный элемент будет свободен вместе с основным объектом JSON json_body. Это означает, что счетчики ссылок всех подобъектов автоматически уменьшаются. Если счетчик падает до 0, объект свободен.

Если вы удерживаете ссылку на подобъект самостоятельно, объект не будет свободным.

Просто пример:

Вы создаете объект (вызов json_string()), и он получит счетчик ссылок == 1.

Вариант а) (из связанного вопроса)

Вы добавляете этот объект к другому объекту с новой ссылкой. Это делается с помощью json_object_set. Затем счетчик увеличивается до 2.

Если вы удаляете основной объект (json_decref(json_body)) Счетчик снова уменьшается до 1, но строка все еще не освобождена. Вам нужно использовать json_decref(srting), чтобы освободить память.

Вариант б) (ваш код)

Вы добавляете этот объект к другому объекту с передачей существующей ссылки. Это делается с помощью json_object_set_new. Тогда счетчик сохраняется на значении 1.

Если вы удаляете основной объект (json_decref(json_body)) Счетчик уменьшается до 0, и теперь строка освобождается вместе с основным объектом. Вам не нужно использовать json_decref(srting) для освобождения памяти.

...