jansson json_decref неожиданное поведение - PullRequest
0 голосов
/ 18 мая 2018

Я использую библиотеку Янссона для C-проекта.

У меня возникли проблемы с пониманием того, как использовать decf.Должен ли он использоваться после каждого нового параметра json_t или нет?Как я понимаю, Янссон заимствует ссылки, чтобы сделать это проще.

Если я запускаю эту программу и проверяю значения a_id и a_test, они совпадают.Я ожидал ошибку или ноль для a_test.

Я попробовал ту же идею, но затем я добавил decf для json_acc и json_param, но она потерпела крах, прежде чем я смог прочитать значение 1: th.Я предполагал сбой, но не раньше, чем a_test.

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

сторона API:

json_t* parObj;

void loadFile(char* path)
{
    json_error_t error;
    parObj = json_load_file(path, 0, &error);
}

int getAccountId(char* id)
{
    json_t* json_acc = json_object_get(parObj, "accounts");
    json_t* json_param = json_object_get(json_acc, id);
    return json_integer_value(json_param);
}

void cleanJson()
{
    json_decref(parObj);
}

сторона вызывающего абонента:

loadFile("/home/jacob/accountDump.json");
int a_id = getAccountId("10");
cleanJson();
int a_test = getAccountId("10");

1 Ответ

0 голосов
/ 20 июня 2018

Я неправильно понял, как это должно работать, я предполагал, что decf также установит память на ноль.

API удалит ссылки и сделает его свободной памятью, но пока никто не пишеттам или memset его к нулю, и указатель не установлен в нуль, я все еще могу читать значения из этого указателя.

...