1

我有一个 for 循环,在迭代循环时,如果索引甚至是索引,则必须释放 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)
4

1 回答 1

2

您有一些内存问题:

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

您在循环的第一次迭代中立即请求一个新的 JSON 对象。此函数调用创建的对象将不再可访问。这是内存泄漏。


  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。无需等待第二次下一次迭代的开始。
于 2020-06-18T10:20:06.240 回答