首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C: jansson json_decref -分割断层

C: jansson json_decref -分割断层
EN

Stack Overflow用户
提问于 2020-06-18 10:10:25
回答 1查看 497关注 0票数 1

我有一个for循环,在迭代循环时,如果索引甚至是索引,则必须释放json对象,必须再次构造一个新对象,并且必须再次重复这个过程。

同样,使用下面的脚本,

代码语言:javascript
复制
#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对象构造和清除其内存来实现以下结果?

代码语言:javascript
复制
{"10":0,"20":1}
{"10":2,"40":3}
{"10":4,"60":5}
{"10":6,"80":7}
{"10":8,"100":9}

现在,上面的脚本给出了下面的响应,

代码语言:javascript
复制
{"10": 0}
Segmentation fault (core dumped)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-18 10:20:06

您有一些内存问题:

代码语言:javascript
复制
int main(void) {     
  char* s = NULL;      
  json_t *root = json_object();

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

代码语言:javascript
复制
  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个字节的内存中。

代码语言:javascript
复制
    json_object_set_new( root, key, json_integer(i));      
    s = json_dumps(root, 0);
    puts(s);

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

在这个调用之后,您不能再使用root了。引用的对象可能在递减引用计数器后释放。如果您试图在下一次迭代中添加一个新对象,则没有一个有效的对象。这可能会触发您的分段错误。

代码语言:javascript
复制
    //free(s);
    }
  }
}

读你的描述

如果索引甚至是索引,则必须释放json对象,并且必须再次构造一个新对象。

那是真的,但你不能这样做。

来解决你的问题

只有在奇数numbers

  • request迭代结束时,
  • 才释放,这是json_decref之后的一个新对象。不需要等待下一次迭代的开始。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62447591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档