C: jansson json_decref - ошибка сегментации - PullRequest
1 голос
/ 18 июня 2020

У меня есть for l oop, и при итерации l oop, если индекс даже индекс, объект json должен быть освобожден, и снова должен быть построен новый объект, и снова процесс должен повторяться.

Для того же, используя приведенный ниже скрипт,

#include <stdio.h>
#include <string.h>
#include <jansson.h>

int main(void) {     
  char* s = NULL;      
  json_t *root = json_object();

  int myNum[10] = {10, 20, 10, 40, 10, 60, 10, 80, 10, 100};

  for(int i=0; i<10;i++)
  {
    if(i%2==0)
    {

      json_t *root = json_object();
    }

    char *key = (char*)malloc(2);
    snprintf(key, sizeof(key), "%d", myNum[i]);

    json_object_set_new( root, key, json_integer(i));      
    s = json_dumps(root, 0);
    puts(s);

    if(i%2==0){
    json_decref(root);        
    //free(s);
    }

  }
}

Как достичь результата ниже, используя jansson json построение объекта и очищая его память, когда индекс является четным индексом ?

{"10":0,"20":1}
{"10":2,"40":3}
{"10":4,"60":5}
{"10":6,"80":7}
{"10":8,"100":9}

В то время как теперь приведенный выше сценарий дает следующий ответ:

{"10": 0}
Segmentation fault (core dumped)

1 Ответ

2 голосов
/ 18 июня 2020

У вас есть проблемы с памятью:

int main(void) {     
  char* s = NULL;      
  json_t *root = json_object();

Вы запрашиваете новый объект JSON немедленно на первой итерации вашего l oop. В этом случае объект, созданный этим вызовом функции, становится недоступным. Это утечка памяти.


  int myNum[10] = {10, 20, 10, 40, 10, 60, 10, 80, 10, 100};

  for(int i=0; i<10;i++)
  {
    if(i%2==0)
    {
      json_t *root = json_object();
    }

    char *key = (char*)malloc(2);
    snprintf(key, sizeof(key), "%d", myNum[i]);

Это записывает 3 байта в память, которая может содержать только 2 байта.


    json_object_set_new( root, key, json_integer(i));      
    s = json_dumps(root, 0);
    puts(s);

    if(i%2==0){
    json_decref(root);        

После этого вызова вы больше не можете использовать root. Указанный объект, вероятно, будет освобожден после уменьшения счетчика ссылок. Если вы попытаетесь добавить новый объект на следующей итерации, у вас не будет действительного объекта. Это может вызвать ошибку сегментации.

    //free(s);
    }
  }
}

Чтение вашего описания

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

Это правда, но вы не делаете этого так.

Чтобы решить вашу проблему, либо

  • только бесплатно в конце итерации для нечетных чисел
  • запросить новый объект сразу после json_decref. Не нужно ждать начала второй следующей итерации.
...