BSP

【求助】rt-thread上使用cJSON组件包遇到的问题

发布于 2019-10-25 16:55:47
在stm32上面,最近想使用cJSON保存数据。然后在多次进行写操作后,发现文件系统上的json文件出故障了。
针对这些问题,我根据自己的想法验证了我的思考,以下是验证的代码:
主要功能描述:
(1)test_json_str_buf是内存存放的json格式的数据buf,用于写入文件系统。
(2)程序每次写的时候,都会利用cJSON_Parse函数解析内存中的json数据,然后生成cJSON的指针,后续程序操作这个指针进行操作,操作完成后将JSON数据转成字符串存到本地内存。
(3)循环写800次,每次都会往json表后面加一个item。


主要的测试代码
char test_json_str_buf[1024*5];//申请的内存足够
int test_cjson(char* list)
{
int ii = 0;
cJSON *js_list = NULL;
cJSON *item = NULL;
char *json_str;
cJSON * t_cjson = cJSON_Parse(test_json_str_buf);
if(!t_cjson)
{
t_cjson = cJSON_CreateObject();
}

js_list = cJSON_GetObjectItem(t_cjson, list);
if(!js_list)
{
js_list = cJSON_CreateArray();//创建一个数组
cJSON_AddItemToObject(t_cjson, list, js_list);//将数据加入到obj中
}

if(js_list)
{
item = cJSON_CreateObject();
cJSON_AddStringToObject(item, "test", "xxx");
cJSON_AddItemToArray(js_list, item);
}

json_str = cJSON_PrintUnformatted(t_cjson);
if(json_str != NULL)
{
//rt_kprintf("\n\n%s\n\n", json_str);
rt_kprintf("cur len is %d\n", rt_strlen(json_str));
rt_memcpy(test_json_str_buf, json_str, rt_strlen(json_str));
}
else
{
return 0;
}

rt_free(json_str);
cJSON_Delete(t_cjson);//释放
return 1;
}


验证代码
void test_write_json(void)
{
int mm = 0;
char my_buf[16];
for(mm = 0; mm < 800; mm++)
{
rt_sprintf(my_buf, "%s:%d\n", "test", mm);
rt_kprintf("write file is %s\n", my_buf);
if(test_cjson(my_buf) == 0)
{
break;
}
rt_thread_delay(10);
}
rt_kprintf("mm is %d\n",mm);

}
MSH_CMD_EXPORT(test_write_json, test write json);


在测试过程中有如下现象:
在没有运行test_write_json函数之前,内存情况如下:
微信图片_20191025164929.png


执行完成后
微信图片_20191025165039.png
可以看到执行18次,文件长度到513字节的时候就解析出错了。并且内存消耗了4K左右。

疑问:
(1)为什么内存会泄露,明明我每次使用内存的时候都释放掉了?
(2)为什么只能执行18次,然后就解析错了

查看更多

关注者
0
被浏览
1.3k
6 个回答
coulson
coulson 2019-10-27
您好,我最近也遇到了JOSN相关的问题,请问您有没有对平台下发的JSON数据进行过解析?想和您交流一下 weixin:15518189521
还没想好
还没想好 2019-10-28
每执行一次,就查询下内存,看看是否正常。

执行到 18 次,解析错误,可能是内存不够了。
superm
superm 2020-02-15
    本帖最后由 superm 于 2020-2-15 11:03 编辑


下面注释的部分你看下问题是否出在这
json_str = cJSON_PrintUnformatted(t_cjson);
if(json_str != NULL)
{
//rt_kprintf("\n\n%s\n\n", json_str);
rt_kprintf("cur len is %d\n", rt_strlen(json_str));
rt_memcpy(test_json_str_buf, json_str, rt_strlen(json_str));
}
else
{
return 0;////////该段代码是否会导致直接返回,而不执行后面的cJSON_Delete(t_cjson)
}

rt_free(json_str);
cJSON_Delete(t_cjson);//释放
return 1;
}
coulson
coulson 2020-04-03
superm 发表于 2020-2-15 11:01


赞成楼主的说法,cjson获取内存后一直没有释放占用的空间会越来越大,最终崩溃
A.I.R
A.I.R 2020-10-13

同样的问题,请问有没有解决方案啊

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览